私はC#でアプリケーションを書いていますが、ジェネリックの実装については苦労しています。私はそうのような別の継承階層(モデルとビューモデル)でミラーリングされ、継承階層を持っている:継承階層のクラスの汎用メンバに型制約を課すことは可能でしょうか?
class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
class A { public A_Content content; }
class B : A { }
class C : A { }
public class Test
{
IList<A> A_Collection = new List<A>();
public Test()
{
B b = new B();
C c = new C();
b.content = new B_Content();
c.content = new C_Content();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
これは十分に動作しますが、それをキャストする私を残す、content
上の任意のタイプの制約を強制することはありません私はそれを使用するたびに適切な派生クラスです。私は、BオブジェクトがB_Content
のコンテンツしか持たないという制約を強制するようにコンパイラを同調させたいと思います。その時の私の最初のカットされた:
class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
class A { }
class B : A { B_Content content; }
class C : A { C_Content content; }
public class Test
{
IList<A> A_Collection = new List<A>();
public Test()
{
B b = new B();
C c = new C();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
は、これはうまく動作しますが、私が持っているすべてはA
のコレクションであるとき、私はcontent
の共通の要素にアクセスできないことを意味します。私が本当にしたいことのようなものです:
abstract class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
abstract class A<T> { T content; }
class B : A<B_Content> { }
class C : A<C_Content> { }
public class Test {
IList<A<A_Content>> A_Collection = new List<A<A_Content>>();
public Test()
{
B b = new B();
C c = new C();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
これは、しかし、Bは、暗黙のうちに、私は無駄に明示的なキャストを追加しようとしたA.に変換することができないことを訴えて、エラーを生成します。 2番目のモデルよりももっとエレガントに探している制約を表現する方法はありますか?
私が質問を正しく理解していれば、あなたが探しているのはインターフェースです。各コレクションにアクセスできるリスト()が必要ですか? –
@BillCarey:あなたはOOPの可能性を失う特定のタイプにキャストすることによって、このようにしてはいけません。私の答えをもう一度考えてみてください。 – Tigran