OOP - 具有主列表和对象组合的实体的对象

时间:2009-02-23 19:06:16

标签: vb.net oop theory

我正试图解决如何正确实现业务对象的OOP设计:

  1. 在数据库中有一个“主列表”(例如分类)
  2. 是另一个对象的一部分作为属性(即对象组合)但具有其他属性
  3. 这是我坚持理论的地方。假设我有一个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表中定义

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

如果您的ClassificationCustomer类部署在同一个程序集中,则可以将Update()函数标记为friend。这将使该程序集之外的类无法访问。