2011-07-12 6 views
0

OOプログラミングの背後にあるパワーを理解するのに少し苦労しています。私は、一般的にコーディングでわずかに経験があると思っていますが、これよりもずっと簡単になると思っていました。この例では、これがオブジェクト内にオブジェクトを含む正しい/良い方法であるかどうかを判断するために、いくつかの基本コードを作成しました。そうでない場合は、正しい方向に私を導いてください。これは正しい/良いコーディング手法ですか?

私は2つのクラスを持っています:男の子と犬のクラス。 Boyクラスには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 

そしてここクラスである:私は犬から少年クラスへのアクセス権を取得できるようにする必要があり

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は、その所有者(Boy)に固有のプロパティを認識できる必要があるためです。

ありがとうございます。

+1

IMO - あなたがコード化しないDog> Ownerのものではなく、実生活プログラミングの例をモデルにしているときに、オブジェクト指向の例を多く理解しやすくなりました。 –

答えて

1

最初に、変数Privateではなく、Protectedとしてください。派生クラスが直接アクセスする必要はありません。

第2に、これは.NETで多く行われていますが、非常に多くのセッターがないと考えてください。ほとんどのプロパティは、オブジェクトの存続期間内で変更されるべきではありません。例外はDTO(データベースエンティティを表すオブジェクト)です。

また、実際に使用するオブジェクトの側面のみをモデル化するようにしてください。実際のソフトウェアでは、所与のエンティティの大部分の属性は無関係であり(例えば、ライブラリ管理ソフトウェアにおける顧客のヘアカラー)、ソフトウェアによって実際に必要とされるのはほんのわずかである。それらをモデル化するだけです。

第3に、DogクラスがBoyクラスの特定の機能にアクセスする必要がある場合は、この特定の機能を最も簡単に行うことがPublicです。

最後に、犬の所有者をByRef経由でコンストラクタに渡さないでください。これは機能しますが、絶対に意味がありません。実際に必要な場所以外はどこでもByValを使用してください(そして、私はそれがではないと主張します。が必要です、もっと良い解決法があります)。

+0

しかし、単にBoy Class Publicのプロパティを作成するだけの場合、Dogはその特定の所有者をどのように知っていますか? –

+0

@Adam Uhm、それはそれが持っている 'owner'参照を通してします。それは 'Public'のようなアクセス修飾子とは無関係です。 –

+0

さて、私は正しくこれをやったのですか? Dogは、Publicに設定されているBoyのReturnHomeプロパティにアクセスする必要があります。この問題の私のより大きな懸念は、DogがBoy(親オブジェクト、Ownerオブジェクト、何でも)をどのように知っているかです。 –

0

BoyやDogには名前や年齢などの共通点がいくつかありますが、適切なトラックがあります。そのため、これらの共通の属性とメソッドを見て、基本クラスAnimalを作成します少年と犬の両方が派生します。

WRTどのように2つを結び付けるか - 少年は複数の犬を持つことができると考えますが、犬は所有者を1人しか持てないので、おそらくBoy.DogはBoy.Dogs(コレクション)ですがDog.Owner男の子)は大丈夫です。

+0

私は、私の例を複雑にしたくありませんでしたが、私はAnimalのようなクラスから継承できることを知りました。私はコレクションを作成することもできました - 私は学んでいます。 !私は新しい犬を定義する方法と、その犬に犬がどのように含まれているかにもっと関心を持っていました。 –

+0

BoyオブジェクトのDogオブジェクトを自動的に初期化することもできますあなたがボーイをインスタンス化するたびに、自動的に犬を取得します!おそらく、犬を持たない男の子がいるでしょう。 –

関連する問題