2012-12-15 30 views
6

C#でContainer/Componentモデルがどのように相互作用するかを理解するのが少し難しいです。私はどのようにComponentにコンテナとコンポーネントに関する情報を持つSiteオブジェクトが含まれているかを調べます。しかし、私は次のコードを持っていたとします。これは問題なく動作しますSystem.ComponentModelを使って作業する

using System; 
using System.ComponentModel; 

public class Entity : Container { 
    public string Foo = "Bar"; 
} 

public class Position : Component { 
    public int X, Y, Z;  
    public Position(int X, int Y, int Z){ 
     this.X = X; 
     this.Y = Y; 
     this.Z = Z; 
    } 
} 

public class Program { 

    public static void Main(string[] args) { 

     Entity e = new Entity(); 
     Position p = new Position(10, 20, 30); 

     e.Add(p, "Position");    

    }  

} 

、それはコンテナ(エンティティ)とその中に含まれているコンポーネント(位置)を定義します。

ただし、私がp.Site.Containerを呼び出すと、エンティティがIContainerとして返されます。つまり、Fooにアクセスしたい場合は、(Console.WriteLine(p.Site.Container as Entity).Foo);のような明示的な処理が必要です。これはかなり面倒なようです。

何か不足している、または私が欲しいことをする良い方法がありますか?

答えて

2

あなたは何も欠けていません。コンポーネントが内部にあることができるコンテナに関するインタフェースコントラクトはありません。コンテナに追加できるコンポーネントの種類を制限したい場合は、Addメソッドをオーバーロードして、追加するコンポーネントのタイプをチェックします:

public class Entity : Container { 
    public string Foo = "Bar"; 

    public virtual void Add(IComponent component) { 
     if (!typeof(Position).IsAssignableFrom(component.GetType())) { 
      throw new ArgumentException(...); 
     } 
     base.Add(component); 
    } 
} 
+0

したがって、任意のIComponentを受け入れるのではなく、私が探しているものを持っているそれのより特化したバージョン? タイプの制約を持つジェネリックタイプを必要とするのに対し、タイプのタイプチェックでは大きな違いがありますか?私はそこにいると思うだろうが、微妙な瞬間は今私のところで失われている。 –

+1

ジェネリックをこのシナリオに適用するとよいかもしれませんが、残念ながらジェネリックは.NET 2.0で導入されましたが、ComponentModelは.NET 1.0からのものであり、ジェネリックは利用できませんでした。 – Eilon

+0

@Eilon、 'is'演算子を使わないのはどうですか?それは 'IsAssignableFrom'よりはるかにクリーンです。 – Jordan