父类更改后如何更新子类?

时间:2013-03-14 21:52:49

标签: c# inheritance parent-child

我有点麻烦搞清楚这一点。

我的代码结构如下:

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?

5 个答案:

答案 0 :(得分:3)

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

要给出一个真实世界的比喻,如果母亲有疤痕,那么她的所有孩子都会得到同样的疤痕。

答案 1 :(得分:2)

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

pc在这里没有任何共同之处!它们只是两个独立的对象。

选中此项以使其更清晰:

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

这将返回13。

答案 2 :(得分:1)

pc是两个不同的对象。当您致电c.AddSomething()时,c.ParentNum的值为默认0.0

答案 3 :(得分:1)

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

private static double p_num;

但我不确定这是不是你的意图。你的意思是让p_num共享amogst类的所有实例吗?

顺便说一下,你的课程中有很多不必要的代码。这样做:

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

原因:

  • 无需指定默认构造函数。
  • 使用自动属性而不是支持字段

答案 4 :(得分:0)

因为您在子类上调用AddSomething,这是ParentClass的完全独立的实例。 ChildClassParentClass的子类,但这并不意味着它们都指向相同的ParentClass。你基本上有两个对象,你只是在其中一个上调用一个操作。

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

应该给你想要的结果