2009-02-23 167 views
0

我试图总结我的头有关如何为业务对象正确实现面向对象的设计:OOP - 对象为实体主列表和对象组合

  1. 在数据库中有一个“总表” (例如,分类)
  2. 是另一个对象的属性(即对象组合)的一部分,但具有附加属性

这里是我卡上的理论。假设我有一个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级别。我在看整体课程设计时错过了什么?

编辑:保存分类级别到数据库将由客户对象来处理,因为数据库是遗产和水平场在客户表中定义。

回答

1

如果我正确理解您的问题,您的Customer类不需要聚合实际Classification类的实例。它需要有一个单独的类的实例,该类指定分类的级别和类型,由ID或枚举值表示。 Classification类应仅用于管理员维护分类ID /枚举列表的场景。

0

因此,如果我的理解正确,您希望Update()功能仅适用于Customer类。

如果您ClassificationCustomer类在同一程序部署,您可以标记Update()功能friend。这会使该组件以外的类无法访问。

+0

我希望Classification类和Customer类都具有CRUD功能,但我不希望CustomerClassification拥有它们。我是否应该在Customer类中有两个属性进行分类:ClassificationID和Level,前面的组合? – HardCode 2009-02-23 19:25:38

+0

这个想法是在包含List(分类)的客户表单上设置一个ComboBox,并设置Customer.CustomerClassification = ComboBox.SelectedItem。 – HardCode 2009-02-23 19:26:18