是否更好地使用子类中的属性来访问父项,或者将父项公开?

时间:2009-01-19 21:53:41

标签: vbscript class parent-child

我有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私有并在子类中写入属性来访问父属性?

编辑:我想问题应该是,是否存在直接访问父级的任何安全性/可用性问题。
我越是想到它越多,我认为从可用性的角度来看,最好隐藏使用子类的任何人的父级。这样,当您从子类创建对象时,您不必了解有关父类的任何信息。

3 个答案:

答案 0 :(得分:2)

由于这是您的两个班级之间的HAS-A关系,我认为您应该保持原样。您不需要为不需要它的东西引入封装代码。

这是一个伪代码示例:

class Engine
    [method] start()

class Car
    [property] Engine

理想情况下,您希望将Engine作为Car的属性引用,如下所示:

Car.Engine.start()

另一种方法是在Car中编写额外的代码以将方法包装在Engine中。虽然你可以这样做但没有多大意义,因为你只需要将Car的传递方法写入Engine

答案 1 :(得分:1)

不 - 这违反了Law of Demeter;重新考虑接口 - 在什么情况下有人需要访问SubTest对象中包含的Test对象的Text属性?如果这些情况有意义,则需要在SubTest中将Text公开为属性。

鉴于名称,我希望SubTest继承Test,从而自动公开Text属性,但幸好我忘记了VBSCRIPT,所以我不记得它是否支持继承; - )

答案 2 :(得分:0)

我想说这取决于你想要公开的属性数量。但封装始终是一个很好的规则。如果Text是您将访问的唯一属性,我很可能将SubTest_Test设为私有并包装该属性。