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();
    }
}

这怎么会打印 8.0 而不是 13.0?

4

5 回答 5

3

因为ChildClass继承自ParentClass并不意味着每个实例都ChildClass继承一个实例的属性ParentClass。它们是单独的对象。

用现实世界的类比,如果这是真的,如果一个母亲有疤痕,她所有的孩子都会得到同样的疤痕。

于 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();

pc这里没有共同点!它们只是 2 个独立的对象。

检查此以使其更清楚:

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

这将返回 13。

于 2013-03-14T21:56:10.463 回答
1

pc是两个不同的对象。调用c.AddSomething()时,值为c.ParentNum默认值0.0

于 2013-03-14T21:56:09.213 回答
1

如果您将 Parent.p_num 声明为静态,它将起作用:

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. 你基本上有两个对象,你只是在其中一个上调用一个操作。

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 回答