2012-03-11 7 views
4

デコレータ/アダプタのような機能を拡張したいクラスがありますが、拡張しているクラスが拡張しているクラスの種類について何か知る必要はありません私が拡張したいオブジェクトの種類ごとに新しいクラスを書く必要はありません。しかし、私が拡張したいと思うオブジェクトはすべて共通の基底クラス、Teamを共有しています。これが私の最初のアイデアだったので、ここでは、ジェネリック医薬品の使用のために熟し聞こえる:このデザインパターンはどのようなものでしょうか?いいですか? (C#)

public class TournamentTeam<T> : T 
    where T : Team 
{ 
    private int mSeed; 

    public TournamentTeam(T team, int seed) 
     : base(team) 
    { 
     /* 
     * error checking stuff here 
     */ 

     // set class variables 
     this.mSeed = seed; 
    } 

    public int Seed 
    { 
     get { return this.mSeed; } 
    } 
} 

私はTのメンバーにアクセスしたい場合は、今、新しいクラスは、それらのすべてを持っているように、これは、私が望んで行っているでしょう。基本コンストラクタは、拡張されたクラスがそれを心配する必要がないような方法で状態を設定します。デコレータ/ファサード型の方法で内部オブジェクトを指すために、どのメソッドをオーバーライドするかを知る必要もありません。言うまでもなく、これはコンパイルされませんでした。だから、少し違ったことを試しました。

public class TournamentTeam<T> : Team 
     where T : Team 
    { 
     #region class variables 
     private int mSeed; 
     private T mTeam; 
     #endregion 

     public TournamentTeam(int seed, T team) 
      : base(team) 
     { 
      /* 
      * error checking stuff here 
      */ 

      // set class variables 
      this.mSeed = seed; 
      this.mTeam = team; 
     } 

     public int Seed 
     { 
      get { return this.mSeed; } 
     } 

     public T Team 
     { 
      get { return this.mTeam; } 
     } 
    } 

「基本クラス」の機能を使いたい場合は、チームプロパティを呼び出すだけでいいです。そして、それは一般的なので、私は機能に到達するためにボクシングを行う必要はありません。それは動作します、それはかなりですが、それは動作します。

これはどんなパターンですか、存在すればどんな落とし穴がこのアイデアで見ますか?これを達成するより良い方法はありますか?またimplimentationよう

答えて

1

これは私が校長と「戦略」のパターン(イム間違っていない場合)、「相続上の賛成組成物」それ を見るように行われるべきものである

私は。

1

C#では、型パラメータからの継承が許可されていないことは残念です。なぜなら、最初の設計が理想的だと思うからです。

チームから継承されたすべてのパブリックTournamentTeamメンバーがカプセル化されたチームに向けて呼び出されることを保証するならば、2番目のデザインはアダプターパターンの合理的なアプリケーションのようです。

私はC#でこれを設計した場合に個人的に、私は無地の組成物の有利なAdapterパターンを捨てて、次のような何かしたい:何か他のものに

  • 名前の変更TournamentTeamを...多分TournamentTeamAllocationまたはTournamentTeamInfoまたはそのようなもの(名前は難しい!)。基本的には、(すなわち、種)は、それはそれはまだT : Teamが含まれるようにカプセル化してください
  • をサブクラスしないよう
  • 変更トーナメントとチームの両方に関連するデータを扱うための責任があると思います。
関連する問題