6

コンテナー/コンポーネント モデルが C# でどのように相互作用するかを理解するのに少し苦労しています。コンテナとコンポーネントに関する情報を持つサイトオブジェクトがコンポーネントにどのように含まれているかを取得します。しかし、次のコードがあるとします。

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 として返されます。つまり、(Console.WriteLine(p.Site.Container as Entity).Foo);Foo にアクセスしたい場合は、明示的に何かを行う必要があります。これはかなり面倒そうです。

私は何かが足りないのですか、それとも私がやりたいことをするためのより良い方法はありますか?

4

1 に答える 1

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);
    }
}
于 2012-12-15T16:53:07.570 に答える