我正试图解决如何正确实现业务对象的OOP设计:
这是我坚持理论的地方。假设我有一个Classification对象,继承自定义了CRUD函数的抽象类BusinessObject(MustOverride)。这会给我:
Public MustInherit Class BusinessObject
Public Sub New()
End Sub
Public MustOverride Function Create() As Boolean
Public MustOverride Sub Read(ByVal id As Integer)
Public MustOverride Function Update() As Boolean
Public MustOverride Function Delete() As Boolean
End Class
Public Class Classification
Inherits BusinessObject
<Fields, properties, etc. for ID, Name (or Description), and
IsActive. DB table has only these 3 fields.>
Public Sub New()
MyBase.New()
End Sub
Public Overrides Function Create() As Boolean
Dal.Classifications.Create(Me)
End Function
Public Overrides Function Delete() As Boolean
Dal.Classifications.Delete(Me)
End Function
Public Overloads Overrides Sub Read(ByVal id As Integer)
Dal.Classifications.Read(Me)
End Sub
Public Overrides Function Update() As Boolean
Dal.Classifications.Update(Me)
End Function
End Class
这将允许我在表单上使用Classification对象,系统管理员可以在该表单上管理系统中的分类主列表。这里没问题。
现在,我希望Customer对象具有Classification(对象组合)类型的属性,但有一点需要注意 - 当Classification对象成为Customer对象的属性时,Classification对象需要一个额外的字段Level。根据业务,级别是分类的逻辑部分 - 分类具有应用程序用户输入的数字级别。所以我创建了一个继承自Classification:
的CustomerClassification类Public Class CustomerClassification
Inherits Classification
Private _level As Integer
Public Property Level() As Integer
Get
Return _level
End Get
Set(ByVal value As Integer)
_level = value
End Set
End Property
Public Sub New()
MyBase.New()
End Sub
End Class
Customer对象将由CustomerClassification组成:
Public Class Customer
Inherits BusinessObject
Public Property Classification() As CustomerClassification
........ etc
End Class
现在,我的设计问题是CustomerClassification对象中仍然显示了Create,Read,Update和Delete函数:
Dim c as New Customer
c.CustomerClassification.Update() ' <-- Not desirable!
我可以在这里实施哪种其他设计?我认为这是错误的设计方式,但我没有看到一个简单的替代模式。我不想通过不继承Classification并重复所有字段和属性代码来重复CustomerClassification类中的代码,但我也不想将CRUD函数暴露给CustomerClassification级别。在整体课堂设计中我缺少什么?
编辑将分类级别保存到数据库将由客户对象处理,因为数据库是旧版,而Level的字段在customer表中定义
答案 0 :(得分:1)
如果我正确理解您的问题,您的Customer类不需要聚合实际Classification类的实例。它需要具有单独类的实例,该类指定分类的级别和类型,由ID或枚举值表示。 Classification类只应在管理员维护分类ID /枚举列表的场景中使用。
答案 1 :(得分:0)
因此,如果我理解正确,您希望Update()
功能仅适用于Customer
类。
如果您的Classification
和Customer
类部署在同一个程序集中,则可以将Update()
函数标记为friend
。这将使该程序集之外的类无法访问。