2017-07-05 11 views
0

私は単にこのよう子/親の継承/鋳造とジェネリックタイプ

abstract class Base 
{ 
} 

class Inherited : Base 
{ 
} 

基底クラスと継承されたクラスを定義した場合、私はエラーなしBase a = new Inherited();を自由に使用できています。

しかし、私は以下のコードを参照例えば汎用の持つ複雑な基底クラス、持っている場合:

abstract class AnotherBase<TDetailType> where TDetailType : AnotherDetail 
{ 
    public List<TDetailType> Children { get; set; } 
} 

abstract class AnotherDetail 
{ 
} 

をそして、私はクラス

class AnotherInherited : AnotherBase<AnotherInheritedDetail> 
{ 
} 

class AnotherInheritedDetail : AnotherDetail 
{ 
} 

を継承しているもちろん、私は、任意のより多くの同様の構文を使用することができませんでしたAnotherBase<AnotherDetail> b = new AnotherInherited();コンパイラがエラーメッセージを表示するため、

重大度コード説明\ tempに\ ConsoleApplication3 \ ConsoleApplication3 \ Program.csを15アクティブ

方法をどれ提案:ptionプロジェクトファイル行抑制状態 エラーCS0029は、暗黙のうちに 'ConsoleApplication3.AnotherBase' ConsoleApplication3 cに 'ConsoleApplication3.AnotherInherited' タイプ を変換できません。このような状況下で継承クラスを表すためにベースクラスを使用することはできますか?

+0

でも、 'AnotherBase b = new AnotherInherited()'を使用することができます。 –

+0

@JonSkeet、trueこのようにすることができます。しかし、もし私がより継承したクラスを持っていれば、 'b'変数の同じ定義を使用してそれらを扱う機会はありません。 – hardywang

+0

あなたはどのように期待しますか? 'b.Children'のタイプは何でしょうか? –

答えて

1

もちろん、これはうまくいかないでしょう。

クラスAnotherInheritedは、AnotherBase<AnotherInheritedDetail>であり、AnotherBase<AnotherDetail>ではありません。これはあなたにとって悲惨なように見えるかもしれませんが、あなたはジェネリックスではなく、別のクラスを継承しています。

オブジェクトの操作中にジェネリックを相互交換可能にすることができますが、class定義にはこの1つの継承しかないことが示されています。

少なくともそれは私の理解です。

+0

私はあなたがここで何を意味するかを見ます。私の全面的な問題は、https://stackoverflow.com/questions/44833289/i-need-to-2-levels-of-inheritance-and-abstraction-in-master-child-relationshipから始まり、私はその提案を受け入れましたこのモデルで。しかし今、挑戦は継承です。たぶんあなたはいくつかのより良いデザインをお勧めできますか? – hardywang

+0

継承クラスのジェネリックデザインをプッシュすることもできます。私はあなたがそれがいくつかのクラスから何かになることを強制することができることを意味します。 –

+0

はい汎用クラスを継承したクラスにプッシュするのは便利です。しかし、一方で、具体的なクラスがあると、「子」のタイプも定義されます。したがって、私は継承クラスでジェネリックを使用しませんでした。たぶんそれは私がバランスを取らなければならないトレードオフでしょう。 – hardywang