这是一个正确/良好的编码实践吗?

时间:2011-07-12 13:28:13

标签: vb.net oop design-patterns

我正在努力了解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)。

谢谢。

2 个答案:

答案 0 :(得分:1)

首先,制作变量Private,而不是Protected。派生类无需直接访问它们。

其次,虽然在.NET中做了很多,但考虑没有这么多的setter。大多数属性不应在对象的生命周期中更改。 DTO是一个例外 - 代表数据库实体的对象。

还要注意模拟实际使用的对象的那些方面。在真实软件中,给定实体的大多数属性是无关紧要的(例如,图书馆管理软件中的客户的头发颜色),并且软件实际上只需要少数几个属性。只模仿那些。

第三,如果您的Dog课程需要访问Boy课程中的特定功能,那么最简单的方法就是使这一特定功能成为Public

最后,不要通过ByRef将狗的所有者传递给构造函数。这有效,但绝对没有意义。在任何地方使用ByVal除非确实需要(我认为从不需要,有更好的解决方案)。

答案 1 :(得分:0)

你走在正确的轨道上,虽然有一些男孩和狗有共同点,比如姓名和年龄,所以现在你要看看那些常见的属性和方法,并创建一个基类Animal男孩和狗都会得到。

WRT你如何把两者绑在一起 - 考虑一个男孩可以有多只狗,但一只狗只能有一个主人,所以可能Boy.Dog应该是Boy.Dogs(一个集合)但Dog.Owner(作为男孩) )绝对没问题。