0

私はこれを理解するのに少し苦労しています。

私のコード構造は次のとおりです。

public class ParentClass
{
    private double p_num;

    public ParentClass()
    {
    }

    public void AddSomething(double num)
    {
        System.Console.WriteLine(ParentNum + num);
    }

    public double ParentNum
    {
        set { p_num = value; }
        get { return p_num; }
    }
}

public class ChildClass : ParentClass
{
    private double c_num;

    public ChildClass()
    {

    }

    public void AddSomething()
    {
        base.AddSomething(ChildNum);
    }

    public double ChildNum
    {
        set { c_num = value; }
        get { return c_num; }
    }
}

public class Test
{
    public static void Main()
    {
        ParentClass p = new ParentClass();
        ChildClass c = new ChildClass();
        c.ChildNum = 8.0;
        p.ParentNum = 5.0;
        c.AddSomething();
    }
}

これが 13.0 ではなく 8.0 を出力するのはなぜですか?

4

5 に答える 5

3

からChildClass継承するということは、 のすべてのインスタンスがのインスタンスのプロパティを継承するParentClassという意味ではないためです。それらは別個のオブジェクトです。ChildClassParentClass

現実世界で例えると、これが本当なら、母親が傷を負った場合、すべての子供が同じ傷を負うことになります.

于 2013-03-14T21:56:02.970 に答える
2
    ParentClass p = new ParentClass();
    ChildClass c = new ChildClass();
    c.ChildNum = 8.0;
    p.ParentNum = 5.0;
    c.AddSomething();

pここにcは何の共通点もありません!それらは 2 つの別個のオブジェクトにすぎません。

これを確認して、より明確にします。

ChildClass c = new ChildClass();
c.ChildNum = 8.0;
c.ParentNum = 5.0;
c.AddSomething();

これは 13 を返します。

于 2013-03-14T21:56:10.463 に答える
1

pcは 2 つの異なるオブジェクトです。を呼び出すとc.AddSomething()、 の値がc.ParentNumデフォルトになります0.0

于 2013-03-14T21:56:09.213 に答える
1

Parent.p_num を static として宣言すると、次のように機能します。

private static double p_num;

しかし、それがあなたの意図であるかどうかはわかりません。クラスのすべてのインスタンス間で p_num を共有するということですか?

ところで、クラスには不要なコードがたくさんあります。これは次のようになります。

public class ParentClass
{
    public void AddSomething(double num) {
        System.Console.WriteLine(ParentNum + num);
    }

    public double ParentNum { get; set; }
}

public class ChildClass : ParentClass
{
    public void AddSomething() {
        base.AddSomething(ChildNum);
    }

    public double ChildNum { get; set; }
}

理由:

  • デフォルトのコンストラクターを指定する必要はありません。
  • バッキング フィールドの代わりに自動プロパティを使用する
于 2013-03-14T21:58:01.260 に答える
0

AddSomethingとは完全に別のインスタンスである子クラスを呼び出しているためですParentClassChildClassは のサブクラスですがParentClass、両方が同じ を指しているわけではありませんParentClass。基本的に 2 つのオブジェクトがあり、そのうちの 1 つで操作を呼び出すだけです。

public class Test
{
    public static void Main()
    {
        ChildClass c = new ChildClass();
        c.ChildNum = 8.0;
        c.ParentNum = 5.0;
        c.AddSomething();
    }
}

あなたが望む結果をあなたに与えるでしょう

于 2013-03-14T21:56:34.347 に答える