2009-01-19 62 views
2

我有2個班,一個家長和一個孩子。使用子類中的屬性訪問父類還是使父類公共更好?


Class Test 
    Private Test_Text 

    Private Sub Class_Initialize() 
     Test_Text = "Hello" 
    End Sub 

    Private Sub Class_Terminate() 

    End Sub 

    Public Property Get Text 
     Text = Test_Text 
    End Property 

    Public Property Let Text(ByVal strIn) 
     Test_Text = strIn 
    End Property 
End Class 

Class SubTest 
    Public SubTest_Test 
    Private SubTest_Interger 

    Private Sub Class_Initialize() 
     Set SubTest_Test = New Test 
    End Sub 

    Private Sub Class_Terminate() 
     Set SubTest_Test = Nothing 
    End Sub 

    Public Property Get int 
     int = SubTest_Integer 
    End Property 

    Public Property Let int(ByVal intIn) 
     SubTest_Integer = intIn 
    End Property  
End Class 

因爲我已經SubTest_Test公共我可以訪問它通過子類這樣


Set MyTest = New SubTest 
MsgBox MyTest.SubTest_Test.Text 

這是可以接受的,或者我應該在子類訪問家長讓SubTest_Test私人和寫入性能屬性?

編輯:我想這個問題應該是,有直接訪問父母的任何安全/可用性問題。
我越想越想從可用性的角度來看,最好是隱藏使用子類的任何人的父項。這樣,當你從子類創建一個對象時,你不必知道父類的任何內容。

回答

1

否 - 這違反了Law of Demeter;重新考慮接口 - 在什麼情況下需要訪問SubTest對象中封閉的Test對象的Text屬性?如果這些情況有意義,則需要將Text作爲SubTest中的屬性公開。

鑑於我本來期望的子測試,從測試繼承,因此自動公開Text屬性的名稱,但幸運的是我已經忘了VBSCRIPT,所以我不記得,如果它甚至支持繼承;-)

2

由於這是你的兩個類之間的HAS-A關係,所以我認爲你應該保持原樣。你不需要爲不需要的東西引入封裝代碼。

下面是一個僞代碼示例:

class Engine 
    [method] start() 

class Car 
    [property] Engine 

理想情況下,你要引用Engine像這樣的Car屬性:

Car.Engine.start() 

另一種方法是編寫額外的代碼Car以包裝Engine中的方法。雖然你可以做到這一點,但沒有多大意義,因爲你只需編寫從CarEngine的傳遞方法。

+0

這似乎是以這種方式進行這樣的論證。當我啓動我的汽車時,我不想讓引擎啓動,我不想單獨啓動每個系統。我想要一個啓動所有系統的Car.Start()。 – Tester101 2009-01-20 00:40:21

+0

不錯的一點!我同意Car.Start()從組織的角度來看,將Engine方法收集到一個地方是有意義的。然而,最初的問題是詢問是否創建與子類屬性直接映射到父類的1對1關係。 – 2009-01-20 01:14:03

0

我想說這取決於你想暴露的屬性的數量。但封裝永遠是一條很好的規則。如果文本是您將訪問的唯一屬性,我很可能會使SubTest_Test變爲私有幷包裝該屬性。