我試圖總結我的頭有關如何爲業務對象正確實現面向對象的設計: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