我正在努力思考如何为以下业务对象正确实现 OOP 设计:
- 在数据库中有一个“主列表”(例如分类)
- 是作为属性(即对象组合)的另一个对象的一部分,但具有附加属性
这就是我坚持理论的地方。假设我有一个分类对象,它继承自抽象类 BusinessObject 并定义了 CRUD 函数 (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
这将允许我在系统管理员可以管理系统中的分类主列表的表单上使用分类对象。这里没有问题。
现在,我希望客户对象具有分类类型(对象组合)的属性,但有一个警告 - 当分类对象成为客户对象的属性时,它需要一个附加字段级别。级别是根据业务分类的逻辑部分 - 分类具有应用程序用户输入的数字级别。所以我创建了一个继承自分类的类 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
现在,我的设计问题是 Create、Read、Update 和 Delete 函数仍然暴露在 CustomerClassification 对象中:
Dim c as New Customer
c.CustomerClassification.Update() ' <-- Not desirable!
我可以在这里实现什么样的其他设计?很明显我设计的方式错误,但我没有看到一个简单的替代模式。我不想通过不继承分类并重复所有字段和属性代码来重复 CustomerClassification 类中的代码,但我也不想将 CRUD 函数发布到 CustomerClassification 级别。在查看整体课程设计时我缺少什么?
编辑:将分类级别保存到数据库将由客户对象处理,因为数据库是旧的,并且级别的字段是在客户表中定义的。