0

我正在努力思考如何为以下业务对象正确实现 OOP 设计:

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

这就是我坚持理论的地方。假设我有一个分类对象,它继承自抽象类 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 级别。在查看整体课程设计时我缺少什么?

编辑:将分类级别保存到数据库将由客户对象处理,因为数据库是旧的,并且级别的字段是在客户表中定义的。

4

2 回答 2

1

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

于 2009-02-23T19:24:45.113 回答
0

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

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

于 2009-02-23T19:22:20.393 回答