存在しないセットメソッドをオーバーライドしようとしますが、されている単語「オーバーライド」宣言で、コンパイラは基本クラスの同じシグネチャを持つメソッドを探します。そのメソッドを見つけることができないので、あなたのセットを作成することはできません。
ArsenMkrtによれば、ベース宣言に保護されたセットが含まれるように変更できます。これによりオーバーライドできますが、依然として署名を変更することができないため、このメソッドをサブクラスでpublicにプロモートすることはできません。したがって、投稿したコードは機能しません。
代わりに、何もしない(または試して呼び出しても例外をスローする)パブリック仮想セットメソッドを基本クラスに追加する必要がありますが、これはクラスのユーザーが期待するもの
///<summary>
///Get the Text value of the object
///NOTE: Setting the value is not supported by this class but may be supported by child classes
///</summary>
public virtual string Text
{
get { return text; }
set { }
}
//using the class
BaseClass.Text = "Wibble";
if (BaseClass.Text == "Wibble")
{
//Won't get here (unless the default value is "Wibble")
}
は、そうでない場合は、別の方法のようにセットを宣言:あなたがこれを行う場合の動作は(と私はそれをお勧めしません)、とてもよく、ユーザはそれを見逃すことができないことを文書化されていることを確認しそうであることをあなたの子供のクラス:
public override string Text
{
get { return differentText; }
}
public void SetText(string value)
{
differentText = value;
}
私は正確に同じことをしたいと思います。可能でなければならない。 –
可能ですが、「中産階級」が必要です。また、多くの状況では良い考えではありませんが、抽象プロパティをオーバーライドする場合など、いくつかの例外があります。ベース: 'public abstract string Text {get; } '。中間(継承ベース): 'protected internal string text;' 'public sealed override string Text {get {return text; }} '。子(中間を継承します): 'public new string Text {get {return text; }セット{テキスト=値; }} '。保護された内部修飾子と密封されたオーバーライドは、カプセル化がアセンブリの外側で壊れていないことを保証します。 – AnorZaken
@AnorZaken:これは無効になっていません。それはシャドーイングです。それは "中間"クラスを必要としません。 – Guffa