2011-01-11 15 views
0

のは、私は次の階層を作成したい考えてみましょう:階層型クラスの設計

動物 - >クラス(哺乳類、両生類、...) - >ファミリー(ネコ科、イヌ科、...) - >種(猫、トラ、...)。

各サブクラスは前のサブクラスに依存します。

これに類似したツリーのようなクラスを作成するための最良の方法論に関する提案はありますか?

これは私が手に持っているが、解決策は私をたくさん助けとなる、問題のほんの一例です...

おかげ

本当の問題はこれです:私が解析する必要が

次のタイプのメッセージ0102060800FF。

まず、01は私に特定の種類のメッセージがあると伝えます。 その型を指定すると、特定のテーブルなどの値02を検索する必要があります。

親によってフィルタリングされた下位階層の値が必要です。私は十分に明確であるかどうか分からない。

ありがとう

+1

もっと具体的な例が役立ちます。 – svrist

+0

あなたの質問では、オブジェクト指向プログラミングの目的と継承が何であるかを定義しました。あなたの質問から私はあなたがしようとしていることについて混乱しています。あなたはそのようなグラフを視覚的に表示するクラスを考え出していますか?または、プログラム上のデータオブジェクトの構造について話していますか? –

+0

私はデータ構造について話しています。実際の例では、私はクラス型の階層を作成したいと思います。私がType1としてベースカルスを定義した場合、次のような可能性はタイプの特定の範囲に限定されます – tekknoplast

答えて

1

最近、継承を超えた構成になっています。ここでは例を挙げます - 適切な階層に追加しているかどうかを確認するために、さらに論理チェックが必要です。

public class Class 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Family 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Species 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Animal 
{ 
    private readonly Class @class; 
    private readonly Family family; 
    private readonly Species species; 

    public Animal(Class @class, Family family, Species species) 
    { 
     if (@class == null) 
     { 
      throw new ArgumentNullException("@class"); 
     } 

     if (family == null) 
     { 
      throw new ArgumentNullException("family"); 
     } 

     if (species == null) 
     { 
      throw new ArgumentNullException("species"); 
     } 

     [email protected] = @class; 
     this.family = family; 
     this.species = species; 
     [email protected](this); 
     this.family.AddAnimal(this); 
     this.species.AddAnimal(this); 
    } 

    public Class Class 
    { 
     get 
     { 
      return [email protected]; 
     } 
    } 


    public Family Family 
    { 
     get 
     { 
      return this.family; 
     } 
    } 


    public Species Species 
    { 
     get 
     { 
      return this.species; 
     } 
    } 
} 
1

実際の動物までのすべてのクラスは抽象クラスです。タイガーは、抽象クラスFelidae、抽象クラス哺乳動物などから継承する具象クラスです。

本当に欲しいのであれば、IPredator、IWarmBloodedなどのインターフェイスを使用できます。それらを能力として定義する。

+0

あなたはCANを使用しなければならないという理由だけではなりません。インターフェースを定義する具体的な理由がない限り(例えば、他のものとは異なる捕食者を扱う必要がある場合)、すべての可能な分類についてクラスまたはインターフェースを作成するべきではありません。 – Mark

+0

もちろん、それは彼が決定するためのものです。彼は「なぜ」ではなく「どのように」求めていた。 –

+0

彼のアップデートを見てみたら、それはオブジェクト階層ではなくLINQプロバイダを書くべきであるように見えます。 –