为什么派生类中重写的自动实现属性与C#中的虚基类属性具有不同的值

M. *_*sif -3 c# inheritance overriding properties

我有一个'base',它有一个virtual int名为'id' 的自动实现属性.

class bbase
{
    public virtual int id { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

当我从这个类继承到'派生'类时,我得到:

class Derived : bbase
{
    public override int id
    {
        get
        {
            return base.id;
        }
        set
        {
            base.id = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

初始化基类和派生类并将值分配给基类属性后,如下所示:

bbase b2 = new bbase();
Derived d2 = new Derived();
b2.id = 6;
Run Code Online (Sandbox Code Playgroud)

当我尝试从派生类输出值时,它输出'0':

Console.WriteLine(d2.id);
Run Code Online (Sandbox Code Playgroud)

我的困惑是,当我尝试使用虚拟方法的相同方法时,它工作正常.base.method()工作正常的派生类方法.它返回基本方法中的任何内容,但为什么不返回自动实现的属性?

class bbase 
{
    public virtual void execute() { Console.WriteLine("base.execute2"); }
}

class Derived : bbase
{
     public override void execute()
     {
         base.execute();
     }
}
Run Code Online (Sandbox Code Playgroud)

Ehs*_*jad 5

两者都是两个独立的对象.所以你看到的是预期的结果.

你试图嘲弄就是可以,如果你重新写你的代码来完成,使这两个变量b2d2指向Derived类的物体,像下面:

Derived d2 = new Derived();
bbase b2 = d2;
b2.id = 6;
Run Code Online (Sandbox Code Playgroud)

现在,如果你这样做:

Console.WriteLine(d2.id); // prints 6
Run Code Online (Sandbox Code Playgroud)

您将看到上面设置的相同值.

在这里查看DEMO.

理想情况下,我认为你不应该base像上面的情况一样在属性getter和setter中调用那种方式,因为你没有对base的值做任何特殊的事情,所以,而不是只使用默认值getset派生类似:

class Derived : bbase
{ 
    public override int id
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你写下面的内容:

Derived d2 = new Derived();
bbase b2 = d2;
b2.id = 6;
Console.WriteLine("d2:"+d2.id);
Console.WriteLine("b2: "+b2.id);
Run Code Online (Sandbox Code Playgroud)

它将输出:

第2:6

b2:6

看到工作DEMO小提琴了解它.