C# 当父类发生更改时,如何更新子类?
我弄明白这件事有点麻烦 我的代码结构如下:C# 当父类发生更改时,如何更新子类?,c#,inheritance,parent-child,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
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?因为
ChildClass
继承自ParentClass
并不意味着ChildClass
的每个实例都继承ParentClass
实例的属性。它们是独立的对象
以现实世界为例,如果这是真的,那么如果一位母亲得了疤痕,她的所有孩子都会得到同样的疤痕。
p
和c
是两个不同的对象。调用c.AddSomething()
时,c.ParentNum
的值是默认值0.0
ParentClass p = new ParentClass();
ChildClass c = new ChildClass();
c.ChildNum = 8.0;
p.ParentNum = 5.0;
c.AddSomething();
p
和c
在这里没有任何共同之处!它们只是两个独立的对象
选中此项以使其更清楚:
ChildClass c = new ChildClass();
c.ChildNum = 8.0;
c.ParentNum = 5.0;
c.AddSomething();
这将返回13。因为您正在对子类调用
AddSomething
,该子类是ParentClass
的一个完全独立的实例ChildClass
是ParentClass
的一个子类,但这并不意味着它们都指向相同的ParentClass
。实际上,您有两个对象,只需对其中一个对象调用一个操作
public class Test
{
public static void Main()
{
ChildClass c = new ChildClass();
c.ChildNum = 8.0;
c.ParentNum = 5.0;
c.AddSomething();
}
}
如果您将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; }
}
原因:
- 无需指定默认构造函数
- 使用自动属性而不是备份字段
p
和c
不一样。谢谢Paul。是的,我希望在父对象的所有子对象之间共享父对象信息。我放了个屁。。。感谢您的代码清理,我是C#@ryrich的新手-您是说您将只拥有父类的一个实例吗?