2011-07-12 45 views
0

我很努力瞭解OO編程背後的力量。當然,我在編碼方面只有一點點經驗,我希望這會比現在容易得多。對於這個例子,我創建了一些基本代碼,以確定這是否是在對象中包含對象的正確/好方法。如果沒有,請你指導我正確的方向。這是一個正確的/良好的編碼習慣?

我有2個班級:男孩和狗班。 Boy類包含一個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 

這裏是一個類:

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 

我需要能夠獲得從狗獲得了男孩類因爲狗需要能夠識別其擁有者(男孩)特有的屬性。

謝謝。

+1

海事組織 - 我發現(並在學習時發現)面向對象的例子很容易理解,當他們模仿現實生活編程的例子,而不是狗>所有者的東西,你永遠不會編碼。 –

回答

1

首先,讓你的變量Private,而不是Protected。派生類無需直接訪問它們。其次,雖然在.NET中這樣做很多,但考慮不要有這麼多的setter。大多數屬性不應該在對象的生命週期中改變。 DTO例外 - 表示數據庫實體的對象。

還要小心模擬您實際使用的對象的這些方面。在真實軟件中,給定實體的大多數屬性都是不相關的(例如,圖書館管理軟件中的客戶的頭髮顏色),並且只有少數軟件真正需要。只模擬那些。第三,如果您的Dog類需要訪問Boy類的特定功能,最簡單的方法是使此特定功能Public

最後,不要將狗的主人通過ByRef傳遞給構造函數。這有效,但絕對沒有意義。使用ByVal無處不在,除非它真的是必需的(我認爲它是從來沒有要求,有更好的解決方案)。

+0

但是,如果我只是做出男孩類公開的屬性,狗將如何知道它的具體所有者? –

+0

@Adam嚴,它通過它擁有的「所有者」引用。這與訪問修飾符無關,如「Public」。 –

+0

那麼我已經正確地做到了這一點?狗需要訪問設置爲公共的男孩的ReturnHome屬性。我對這個問題更加關注的是狗如何知道它的男孩(父對象,所有者對象,無論如何)。 –

0

你走在正確的軌道上,儘管男孩和女孩有一些共同的東西,比如姓名和年齡,所以現在你會看到這些常見的屬性和方法,並創建一個基類Animal from男孩和狗都會從中得到。如果你把兩者結合在一起 - 考慮一個男孩可能有多隻狗,但一隻狗只能擁有一個擁有者,所以可能Boy.Dog應該是Boy.Dogs(一個集合),但Dog.Owner(如男孩)是絕對好的。

+0

我不想讓我的例子變得複雜,但我確實知道我可以繼承像Animal這樣的類,並且我也可以創建一個集合 - 我在學習,我很高興聽到你說這些東西!我更關心我定義新狗的方式以及男孩如何包含狗。 –

+0

我會問,也會自動初始化Boy對象中的Dog對象。任何時候你實例化一個男孩,它會自動獲得一隻狗!有可能是男孩沒有狗。 –

相關問題