我有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私有并在子类中写入属性来访问父属性?
编辑:我想问题应该是,是否存在直接访问父级的任何安全性/可用性问题。
我越是想到它越多,我认为从可用性的角度来看,最好隐藏使用子类的任何人的父级。这样,当您从子类创建对象时,您不必了解有关父类的任何信息。
答案 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设为私有并包装该属性。