我正在努力了解OO编程背后的力量。当然,我只是在编码方面略有经验,我希望这会比它更容易。在这个例子中,我创建了一些基本代码,以确定这是否是在对象中包含对象的正确/好方法。如果没有,请你指导我正确的方向。
我有两个班:一个男孩和一个狗班。 Boy Class包含一个Dog对象。 Dog对象知道它的拥有者是谁。
这是一个男孩类:
Public Class Boy
Protected mName As String
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property
Protected mAge As Integer
Public Property Age() As Integer
Get
Return mAge
End Get
Set(ByVal value As Integer)
mAge = value
End Set
End Property
Protected mReturnHome As New TimeSpan(3, 15, 0)
Public Property ReturnHome() As TimeSpan
Get
Return mReturnHome
End Get
Set(ByVal value As TimeSpan)
mReturnHome = value
End Set
End Property
Protected mPet As New Dog(Me)
Public Property Pet() As Dog
Get
Return mPet
End Get
Set(ByVal value As Dog)
mPet = value
End Set
End Property
End Class
这是一个 Dog 类:
Public Class Dog
Private _owner As Boy
Public Sub New(ByRef Owner As Boy)
_owner = Owner
End Sub
Protected mName As String
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property
Protected mBreed As String
Public Property Breed() As String
Get
Return mBreed
End Get
Set(ByVal value As String)
mBreed = value
End Set
End Property
Protected mCanPlay As Boolean
Public Sub PlayBall()
If Now.TimeOfDay >= _owner.ReturnHome Then
mCanPlay = True
Else
mCanPlay = False
End If
End Sub
End Class
我需要能够从Dog Class获得Boy Class,因为Dog需要能够识别特定于其所有者的属性(Boy)。
谢谢。
答案 0 :(得分:1)
首先,制作变量Private
,而不是Protected
。派生类无需直接访问它们。
其次,虽然在.NET中做了很多,但考虑没有这么多的setter。大多数属性不应在对象的生命周期中更改。 DTO是一个例外 - 代表数据库实体的对象。
还要注意模拟实际使用的对象的那些方面。在真实软件中,给定实体的大多数属性是无关紧要的(例如,图书馆管理软件中的客户的头发颜色),并且软件实际上只需要少数几个属性。只模仿那些。
第三,如果您的Dog
课程需要访问Boy
课程中的特定功能,那么最简单的方法就是使这一特定功能成为Public
。
最后,不要通过ByRef
将狗的所有者传递给构造函数。这有效,但绝对没有意义。在任何地方使用ByVal
除非确实需要(我认为从不需要,有更好的解决方案)。
答案 1 :(得分:0)
你走在正确的轨道上,虽然有一些男孩和狗有共同点,比如姓名和年龄,所以现在你要看看那些常见的属性和方法,并创建一个基类Animal男孩和狗都会得到。
WRT你如何把两者绑在一起 - 考虑一个男孩可以有多只狗,但一只狗只能有一个主人,所以可能Boy.Dog应该是Boy.Dogs(一个集合)但Dog.Owner(作为男孩) )绝对没问题。