2016-06-17 14 views
0

私は以下のクラスを持っています。それぞれのコントロールクラスについて、プロパティを介してデータメンバーを公開したいと思います。C#の派生クラスとプロパティ

public class BasicData {} 
public class AdvancedData : BasicData { } 

public class BasicControl 
{ 
    private BasicData data; 

    public BasicData DataHide; 

    public virtual BasicData DataOverride; 
} 

public class AdvancedControl: BasicControl 
{ 
    private AdvancedData data; 

    public new AdvancedData DataHide; //Hide 

    public override BasicData DataOverride; //Override 
} 

私はプロパティが仮想作る場合は、その後、私のAdvancedControlクラスは(私が好むもの)BasicDataなくAdvancedDataとしてデータを公開しています。

私は基本クラスのプロパティを隠すことができますが、できる限り隠蔽は避けるべきです。

Controlクラスごとに1つのデータプロパティが公開されていますが、このプロパティの各クラスの名前が同じであることを希望します(Data)。 BasicControlの場合、これはBasicDataである必要があります。 AdvancedControlの場合、これはAdvancedDataである必要があります。

これを達成するためのクラスを設計する最良の方法は何ですか?

public class BasicData {} 
public class AdvancedData : BasicData { } 

public class BasiccControl<T> where T : BasicData 
{ 
    private T data; 
    public T Data; 
} 

public class AdvancedControl : BasicControl<AdvancedData> 
{ 
}  

だからあなたがいる限り、あなたがTの正しい一般的な引数を提供して(上書きまたは各誘導体でメンバーを隠し、まだ型の安全性を持っている必要はありません。

+0

genericsを使用できませんか? 'BasicControl どこTData:BasicData'? – Toxantron

+0

私はジェネリックスに 'Control where T:BasicData'があり、' Data'が 'private T data;'となっています。 'AdvancedControl'は' class AdvancedControl:Control 'である。 –

+4

http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance –

答えて

1

あなたは、一般的なアプローチを使用することができます)。