2017-06-29 6 views
1

ビジネスケースがあると仮定しましょういくつかのモデルを使用してマスター - 子構造を表現したいと考えています。マスタークラスと子クラスの両方から継承する特定のクラスがあります。マスターと子の関係で2レベルの継承と抽象化が必要

私は今、私はそれらを継承するために、実際のクラスを必要とする

public abstract class BaseChild 
{ 
    public int MyProperty { get; set; } 
} 

public abstract class BaseMaster 
{ 
    public abstract ReadOnlyCollection<BaseChild> Children { get; } 
} 

下のサンプルを使用しています。だから、エラーが原因

でコンパイルされません。もちろん、

public class FirstRealChild : BaseChild 
{ 
    public int AdditionalProperty { get; set; } 
} 

public class FirstRealMaster : BaseMaster 
{ 
    public ReadOnlyCollection<FirstRealChild> Children { get; } 
} 

を以下の持っている 'FirstRealMaster' 'BaseMaster.Children.get'

を継承した抽象メンバー を実装していません。 BaseMasterクラスからpublic abstract ReadOnlyCollection<BaseChild> Children { get; }を削除できますが、子が必要なすべての継承クラスに対して制約が失われます。

誰か良いアイデアはありますか?

+0

@Flaugzig子のタイプが異なっているので、それは、問題を解決する方法がわかりません。 – hardywang

+0

本当に、私のコードレビューは少し速かったです:) – Flaugzig

+0

* "マスタークラスと子クラスの両方から継承する特定のクラスがあります" * - C#ではなく、存在しません。 –

答えて

3

あなたはジェネリックでどこかに得ることができます:

public abstract class BaseMaster<TChild> where TCHild : BaseChild 
{ 
    // this probably doesn't have to be 'abstract' anymore 
    public abstract ReadOnlyCollection<TChild> Children { get; } 
} 

public class FirstRealMaster : BaseMaster<FirstRealChild> 
{ 
} 

しかし、私たちは必ずマスターと子のクラス間の関係について十分に知りません。

+0

華麗!私はそれが完全に私のために働くと思う! – hardywang

0

「子供を持つ」タイプのジェネリックス+潜在的に非ジェネリックの基本クラスが標準的なソリューションです。 BaseMasterを異なるタイプの子ノード間で割り当て互換にする必要がない場合は、ベース非ジェネリッククラスを削除できます。おおよそ次のような

何か:

public class BaseMaster 
{ 
    public ReadOnlyCollection<BaseChild> Children { get; } 
} 

public class BaseMaster<T> : BaseMaster where T: BaseChild 
{ 
    public new IEnumerable<T> Children { get 
     { 
      return base.Children.Cast<T>(); 
     }; 
    } 
} 
関連する問題