2009-02-23 31 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