2011-09-13 10 views
1

クラスAは抽象クラスであり、それを継承するクラスBが提供しなければならない読み取り専用プロパティを定義しているとします。抽象的またはセットで保護されたとして、このようなプロパティを定義するためのより良い習慣です:読み取り専用プロパティ継承:抽象的なまたはセット保護

public abstract class A 
{ 
    public abstract int Value { get; } 
} 
public class B : A 
{ 
    public override int Value { get { return 1; } } 
} 

OR

public abstract class A 
{ 
    public int Value { get; protected set; } 
} 
public class B : A 
{ 
    public B() 
    { 
     Value = 1; 
    } 
} 

私は最初のソリューションは、おそらく優れていると思いますが、私は他の意見を聞きたいと思います。

答えて

0

これは、読み取り専用の意味によります。発信者のための読み取り専用を意味する場合、私は第2の解決策を好むでしょう。

最初の解決策は、子クラスにgetを実装するよう強制します。しかし、それは子供がset(保護されたものでさえ)を実装することを禁止しています。

2つ目の解決策では、Valueインターフェイス全体が基本クラスによって定義されています。これは良い選択ですが、子クラスも値を設定できます。

一方、「読み取り専用」とは、子クラスでさえも値を設定することができないという点で、本当に読み取り専用という意味で、最初の解決策が優れています。あなたはそれを設定しようとすると正しいコンパイルエラーを得ることさえできます。

+0

私はいくつかの良い点があり、誰も貢献していないので、あなたの答えを受け入れるでしょう。しかし、その間に私はソリューション1を使い終わった。ソリューション2を使って次のことを考えてみよう。第3クラスCはBから継承し、その値を公開したい。また、値は定数ではなく、BとCの両方の多くのメソッドから設定されます。Cが提供するものではなくメソッドの1つを実行している間にBがその値を提供することがあります。つまり、Cはそのプロパティを正しくオーバーライドしていません。だから私は、解決策1は一般に適切であると結論づけました。 – Zmaster

関連する問題