私は 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_Content
B オブジェクトにはコンテンツしかないという制約を強制するようにコンパイラーを説得したいと思います。私の最初のカットは次のとおりです。
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);
}
}
これはうまく機能しますcontent
が、 のコレクションしか持っていない場合の共通要素にアクセスできないことを意味しますA
。私が本当にやりたいことは次のようなものです:
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 番目のモデルよりもエレガントに表現する方法はありますか?