2016-12-07 1 views
0

私は継承階層に一連のクラスを書きたいと思っています。各クラスはそのクラスに固有の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.つまり、機能的に何か似たようなことをする方法はありますか?ちょっと混乱していても大丈夫です。なぜなら、これは私がほとんど決して変更しないライブラリにあるからです。私の目標は、エンドユーザーが汎用的な引数すべてを抽象化しながら使いやすくすることです。

また、私は、タイトルの質問にフレーズする素晴らしい方法を考え出すことができませんでした。私はそれについての提案もありがとうと思います。ありがとう!

答えて

1

ExampleBase example = new ExampleChildLeaf();が必要な場合は、Fooを知らなかった非汎用ベースクラスを作成することで可能ですが、他の機能(まだ他の機能があるとします)を持つことができます。これは、TaskTask<T>の動作に非常に似ています。

public class ExampleBase 
{ 
    //.... 
} 

public class ExampleBase<T> : ExampleBase where T: GenericType 
{ 
    public T Foo 
    { 
     get; 
     set; 
    } 
} 
+0

これは該当します。しかし、 'Foo'にアクセスするには、' Foo'で何かにキャストする必要があります。そうするためには、どのような種類なのか正確に知る必要があります。 – Blarghedy

関連する問題