我试图总结我的头有关如何为业务对象正确实现面向对象的设计: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
这将允许我使用分类对象的窗体上其中一个系统管理员可以管理在系统分类的主列表。这里没有问题。
现在,我想要一个Customer对象具有Classification(object composition)类型的属性,但有一个警告 - Classification对象在成为Customer对象的属性时需要额外的字段Level。级别是根据业务分类的逻辑部分 - 分类具有应用程序用户输入的数字级别。所以,我创建了一个类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
和客户对象将组成CustomerClassification的:
Public Class Customer
Inherits BusinessObject
Public Property Classification() As CustomerClassification
........ etc
End Class
现在,我的设计问题是创建,读取,更新和删除功能仍然暴露在CustomerClassification对象中:
Dim c as New Customer
c.CustomerClassification.Update() ' <-- Not desirable!
我可以在这里实现什么样的其他设计?我设计的方式不对,但我没有看到一个简单的替代模式。我不想通过继承分类并重复所有字段和属性代码来重复CustomerClassification类中的代码,但我也不想将CRUD函数暴露给CustomerClassification级别。我在看整体课程设计时错过了什么?
编辑:保存分类级别到数据库将由客户对象来处理,因为数据库是遗产和水平场在客户表中定义。
我希望Classification类和Customer类都具有CRUD功能,但我不希望CustomerClassification拥有它们。我是否应该在Customer类中有两个属性进行分类:ClassificationID和Level,前面的组合? – HardCode 2009-02-23 19:25:38
这个想法是在包含List(分类)的客户表单上设置一个ComboBox,并设置Customer.CustomerClassification = ComboBox.SelectedItem。 – HardCode 2009-02-23 19:26:18