.NET のプロパティをオーバーライドすることで、アクセサーをプロパティに追加することはできますか?

StackOverflow https://stackoverflow.com/questions/545562

質問

このようなことは可能でしょうか?

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; }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top