私は継承階層に一連のクラスを書きたいと思っています。各クラスはそのクラスに固有のT型のメンバFooを持たなければならない。関係がある場合、この階層のクラスには重複するFooクラスが含まれません。C#でジェネリック関数を機能的に再実装(または再実装)する方法はありますか?
私の最初の考えは、ジェネリックでこれを行うことでした。たとえば、このコードで
public class ExampleBase<T> where T: GenericType
{
public T Foo
{
get;
set;
}
}
public class ExampleChildOne<T> : ExampleBase<T> where T : GenericTypeTwo {}
public class ExampleChildLeaf : ExampleChildOne<GenericTypeLeaf> {}
public class GenericType {}
public class GenericTypeTwo : GenericType {}
public class GenericTypeLeaf : GenericTypeTwo {}
は、私は、変数がGenericTypeLeafである私がしたいタイプですvar foo = new ExampleChildLeaf().Foo;
のようなものを書くことができています。これはいい。しかし、ExampleBase
にはジェネリックタイプが必要なので、私はExampleBase example = new ExampleChildLeaf();
のようなことはできません。 ExampleChildLeaf
は実際にはExampleBase<GenericType>
まで伸びないので、ExampleBase<GenericType> example = new ExampleChildLeaf();
もできません。
私はこれを行うための非一般的な方法も試みました。各クラスには、適切な型を持つ独自のFooがあります(GenericType Fooを持つように、GenericTypeLeaf Fooなどがあります)。この問題は、種類が異なるため、Fooを別のFooで上書きすることができないということです。
So.つまり、機能的に何か似たようなことをする方法はありますか?ちょっと混乱していても大丈夫です。なぜなら、これは私がほとんど決して変更しないライブラリにあるからです。私の目標は、エンドユーザーが汎用的な引数すべてを抽象化しながら使いやすくすることです。
また、私は、タイトルの質問にフレーズする素晴らしい方法を考え出すことができませんでした。私はそれについての提案もありがとうと思います。ありがとう!
これは該当します。しかし、 'Foo'にアクセスするには、' Foo'で何かにキャストする必要があります。そうするためには、どのような種類なのか正確に知る必要があります。 – Blarghedy