.NET のプロパティをオーバーライドすることで、アクセサーをプロパティに追加することはできますか?
-
23-08-2019 - |
質問
このようなことは可能でしょうか?
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B: A
{
private string X;
public override string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
つまり、基本クラスは GET アクセサーのみを備えた仮想プロパティを提供しますが、子クラスは GET をオーバーライドし、SET も提供します。
現在の例はコンパイルできませんが、おそらくここで何かが欠けています。
追加した: 明確にするために、いいえ、new で再定義したくありません。新しいアクセサーを追加したい。これが基本クラスにないことはわかっているので、オーバーライドできません。OK、糖衣構文がなければどのように見えるかを説明してみましょう:
class A
{
public virtual string get_prop()
{
return "A";
}
}
class B: A
{
private string X;
public override string get_prop()
{
return X;
}
public virtual string set_prop()
{
X = value;
}
}
解決
いいえ、それは不可能です。残念ながら、アクセサーレベルをオーバーライドしたり変更したりすることはできません( 保護された に 公共 たとえば)、に文書化されているように、 MSDN. 。コード/クラスを少し再構築することを検討し、set アクセサーを宣言するなど、このタスクを達成する別の方法を探すことをお勧めします。 保護された 派生クラスの SetProperty メソッドを使用する修飾子。
他のヒント
いいえ、これを実行する方法はありません。それが変換される、すなわち、仮想財産のシンタックスシュガーが取り扱われているかについて考えてみます:
public virtual string get_prop();
オーバーライドするset_Prop方法はありません、あなたが存在しないメソッドをオーバーライドすることはできません。
あなたは、あなたの派生クラスで「新しい」キーワードを使用して、基本クラスの実装を非表示にすることができます。以下は、正常にコンパイルする必要があります:
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B : A
{
private string X;
public new string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
汚いの新しいフィールドの萌芽をご紹介します。あなたは(何のプライベートフィールドに基底クラスの会談場合は?)多型と継承を壊さないように注意する必要があります。
のいずれかの方法オーバーライドしながら、新しいアクセサを追加することに関しては、簡単な答えは「いいえ、することはできません」です。あなたがオーバーライドする場合はそれが(オーバーライドされたメンバーはまだクラスではなく、オーバーライドクラスを宣言/ベースによって「所有」された)メンバーの仮想テーブルで定義されているものであるから、あなただけの、既存のアクセサに影響を与えることができます。
一つの選択肢(理想的ではないが)プロパティを再宣言することですが、あなたはまだ基本クラスにまで話をする方法が必要になります。だから、基本クラスでアクセサがprotected
た場合:
class A
{
public string prop
{
get;
protected set;
}
}
class B : A
{
public new string prop
{
get { return base.prop; }
set { base.prop = value; }
}
}