4

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

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 で再定義したくありません。新しいアクセサを追加したい。基本クラスにないことはわかっているので、オーバーライドできません。わかりました、シンタックス シュガーなしでどのように見えるかを説明してみましょう。

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;
    }
}
4

4 に答える 4

1

いいえ、これは不可能です。残念ながら、 MSDNに記載されているように、アクセサ レベルをオーバーライドして変更することはできません (たとえば、保護されたものからパブリックに変更するなど) 。コード/クラスを少し再構築することを検討し、派生クラスで SetProperty メソッドを使用して保護された修飾子で set アクセサーを宣言するなど、このタスクを達成するための代替方法を探すことをお勧めします。

于 2009-02-13T11:13:43.610 に答える
1

いいえ、これを行う方法はありません。仮想プロパティのシンタックス シュガーがどのように処理されるかを考えてみましょう。つまり、次のように変換されます。

public virtual string get_prop();

オーバーライドする set_Prop メソッドはなく、存在しないメソッドをオーバーライドすることはできません。

于 2009-02-13T11:08:10.270 に答える
0

メッシーの新しいフィールド スマックの登場です。いずれにせよ、ポリモーフィズムと継承を壊さないように注意する必要があります (基本クラスがプライベート フィールドと対話するとどうなるでしょうか?)。

オーバーライド中に新しいアクセサーを追加することに関して。簡単な答えは「いいえ、できません」です。オーバーライドすると、既存のアクセサーのみに影響を与えることができます。これは、メンバーの仮想テーブルで定義されているためです (オーバーライドされたメンバーは、オーバーライドするクラスではなく、基本/宣言クラスによって引き続き「所有」されます)。

1 つのオプション (理想的ではありません) は、プロパティを再宣言することですが、基本クラスと対話する方法が必要です。したがって、基本クラスのアクセサーが次の場合protected:

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}
于 2009-02-13T11:13:51.440 に答える