【发布时间】:2018-03-19 16:04:51
【问题描述】:
我有一个“基础”,它有一个名为“id”的virtual int 自动实现的属性。
class bbase
{
public virtual int id { get; set; }
}
当我从这个类继承到“派生”类时,我得到:
class Derived : bbase
{
public override int id
{
get
{
return base.id;
}
set
{
base.id = value;
}
}
}
在初始化基类和派生类并将值分配给基类属性后,如下所示:
bbase b2 = new bbase();
Derived d2 = new Derived();
b2.id = 6;
当我尝试从派生类输出值时,它输出“0”:
Console.WriteLine(d2.id);
我的困惑是,当我使用虚拟方法尝试相同的方法时,它可以正常工作。带有base.method() 的派生类方法可以正常工作。它返回基本方法中的任何内容,但为什么不返回自动实现的属性?
class bbase
{
public virtual void execute() { Console.WriteLine("base.execute2"); }
}
class Derived : bbase
{
public override void execute()
{
base.execute();
}
}
【问题讨论】:
-
b2无论如何都不会连接到您的d2实例。您可以强制转换b2 = (bbase)d2;并查看它是否有效,但您正在创建两个完全不同的对象,它们包含的值彼此不相关。 -
在 b2 = (bbase)d2 之后;现在两者都为零
-
b2 和 d2 不是同一个实例?为什么你会期望在一个中设置一个值会对另一个产生影响?当然,在那次演员之后两者都为零 - 你还没有设置 d2.id
-
重写虚拟成员的期望效果是替换实现(如果有)。因此,如果您有
List<bbase>并在那里存储Derived的实例,那么在调用虚拟成员时将调用后一种类型的实现。继承和覆盖都与 2 个不同的实例无关。 -
方法是类的行为,它们没有值。但是属性是有值的。因此,基类和派生类的两个不同对象可能具有相同的行为,但它们的属性可能具有不同的值。
标签: c# inheritance properties overriding