0

理論的な質問..クラスに仮想プロパティがあります。そのクラスを拡張する別のクラスは、仮想プロパティをオーバーライドしますが、基本プロパティの getter メソッドまたは setter メソッドを実際にオーバーライドすることはないようです。私は何が欠けていますか?

class BaseClass
{
    protected string bla;

    public virtual string Bla
    {
        get { return this.bla; }
        set { this.bla = value; }
    }

    protected BaseClass() { } 

    public BaseClass(string _bla)
    {
        this.Bla = _bla;
    }
}

class ChildClass : BaseClass
{
    private string bla2;

    public override string Bla
    {
        get
        {
            return bla2;
        }
        set
        {
            bla2 = value;
        }
    }

    public ChildClass(string _bla2) : base("AAA")
    {
        this.Bla = _bla2;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var c = new ChildClass("Me");

        Console.WriteLine(c.Bla);

        Console.ReadLine();
    }
}

私は答えを得たと思います。

4

3 に答える 3

1

base("AAA")(子クラスでは field を指している) の値を「AAA」にpublic BaseClass(string _bla) { this.Bla = _bla; }設定する呼び出しは、基本コンストラクターを介して既に割り当てられているためです。this.Blabla2public ChildClass(string _bla2) { this.Bla = _bla2; } this.Blabla2

于 2013-10-16T08:29:24.927 に答える
1

コンパイルできるようにコードを修正すると、期待どおりに動作します。ただし、私が追加したコメントに注意してください!コンストラクターから仮想メソッド (プロパティ セッターですが、メソッドです) を呼び出しています。良くないね。

using System;

namespace Demo
{
    class BaseClass
    {
        protected string bla;

        public virtual string Bla
        {
            get
            {
                return this.bla;
            }
            set
            {
                this.bla = value;
            }
        }

        protected BaseClass()
        {
        }

        public BaseClass(string _bla)
        {
            this.Bla = _bla;
        }
    }

    class ChildClass: BaseClass
    {
        private string bla2;

        public override string Bla
        {
            get
            {
                return bla2;
            }
            set
            {
                bla2 = value;
            }
        }

        public ChildClass(string _bla2)
            : base("AAA")
        {
            // Step into the next line of code in the debugger.
            // You'll see that it goes into the ChildClass.Bla setter.
            // However note that this is making a virtual call in a constructor 
            // - which is very bad if there is a further derived class because
            // it will call a method in that derived class before that derived
            // class has been constructed.
            // You can fix this potential problem by making this entire class
            // sealed or by making the property sealed in this class.

            this.Bla = _bla2; 
        }
    }

    class Program
    {
        private void run()
        {
            var c = new ChildClass("X");

        }

        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}
于 2013-10-16T08:34:54.493 に答える
0

私はあなたのコードで単体テストを行いましたが、動作し、子クラスを追加します:

    public override string ToString()
    {
        return string.Format("bla = {0},bla2 ={1}", bla,bla2);
    }

プロパティを設定した後、このメソッドを呼び出します。

あなたはそれを見てbla=nullbla2="Something"

編集 コメントで述べたように、セッターの可視性のレベルをパブリックに変更し、子クラスのコンストラクターを削除する必要がありました

于 2013-10-16T08:31:29.863 に答える