3

親と子の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 を public にしたので、このように子クラスからアクセスできます


Set MyTest = New SubTest
MsgBox MyTest.SubTest_Test.Text

これは受け入れられますか、それとも SubTest_Test を非公開にし、子クラスにプロパティを記述して親プロパティにアクセスする必要がありますか?

編集:親に直接アクセスする際にセキュリティ/ユーザビリティの問題があるかどうかという質問があったはずです。
考えれば考えるほど、使いやすさの観点から考えると、子クラスを使用する人から親を非表示にする方がよいでしょう。そうすれば、子クラスからオブジェクトを作成するときに、親クラスについて何も知る必要はありません。

4

3 に答える 3

2

これはHAS-Aあなたの 2 つのクラス間の関係なので、そのままにしておくべきだと思います。カプセル化コードを必要としないものにカプセル化コードを導入する必要はありません。

疑似コードの例を次に示します。

class Engine
    [method] start()

class Car
    [property] Engine

理想的には、次のようなEngineプロパティとして参照する必要があります。Car

Car.Engine.start()

別の方法として、追加のコードを に記述しCarて、メソッドを でラップすることもできEngineます。Carこれを行うことはできますが、単純に からへのパススルー メソッドを記述するだけなので、あまり意味がありませんEngine

于 2009-01-19T21:57:07.277 に答える
1

いいえ - これはデメテルの法則に違反しています。インターフェースを再考してください - SubTest オブジェクト内の同封された Test オブジェクトの Text プロパティにアクセスする必要があるのはどのような状況ですか? これらの状況が理にかなっている場合は、Text を SubTest のプロパティとして公開する必要があります。

名前を考えると、SubTest が Test から継承され、Text プロパティが自動的に公開されることを期待していましたが、ありがたいことに VBSCRIPT を忘れていたので、継承をサポートしているかどうか思い出せません ;-)

于 2009-01-20T04:29:49.713 に答える
0

公開したいプロパティの数に依存すると思います。ただし、カプセル化は常に従うべき適切なルールです。アクセスする唯一のプロパティが Text である場合は、おそらく SubTest_Test を非公開にしてプロパティをラップします。

于 2009-01-19T21:57:56.620 に答える