理解覆盖和新 属性

understanding override and new property

    class Car
    {
        public virtual string Name { get; set; }

        public virtual void CheckName()
        {
            throw new NotImplementedException();
        }

    }

class ConveribleCar : Car
{
    public override string Name { get; set; }

    public override  void CheckName()
    {
        Console.WriteLine("this :{0} , base : {1}", this.Name, base.Name); 
    }

}

class Minivan : Car
{
    public new string Name { get; set; }

    public override void CheckName()
    {
        Console.WriteLine("this :{0} , base : {1}", this.Name, base.Name);
    }
}


and the calling code : 
Car car = new Minivan(){Name = "Minivan"};//using new property
Car car2 = new ConveribleCar(){Name = "Convertible"};//using override property
car.CheckName(); //prints this : Minivan, base : (null or empty)
car2.CheckName(); //prints this : Convertible , base :(null or empty)

我了解方法中的虚拟化理论,如果您使用关键字 new 它会隐藏派生的方法 class, 如果你使用 override 新的实现被计算在内并且它被使用,但我不明白为什么这没有发生 对于 properties ,根据我的理解,我应该期望 car 中的 base.Name 应该打印 "Minivan" (因为隐藏了 class Minivan 中的派生名称)ans this.Name 将为 null . (据我所知)

另外,当我在 VS 中检查对象 car car.Name is null 即使它打印 "Minivan" 时,这种行为对我来说真的很奇怪。 任何人都可以给我解释示例代码中发生的事情,或者任何人都可以提出一个更好的例子来说明如何真正看到新的和覆盖属性以正确的方式工作以便我能够理解,也许我的例子很糟糕。

提前致谢。

无论您覆盖还是隐藏 Name 属性,都会有 2 个具有该名称的独立属性,您可以通过 this.Namebase.Name.

要查看您预期的行为,您可能应该直接打印出 car.Name,您将看不到任何结果 - 它为空。 car是编译时类型Car,所以没有使用子类实现。它解析为未设置的 Car.Name。请注意,打印 car2.Name 会打印被覆盖的 属性,正是因为 属性 被覆盖了。

那么为什么打印 car.Name 会得到 null,而在 CheckName 中打印 this.Name 却不起作用?

CheckName 被覆盖,因此将调用 Minivan 中的实现。现在在方法的上下文中,this 是编译时类型 Minivan,不是吗?所以在这种情况下,this.Name 指的是 Name 的子类实现,因此 Minivan 被打印出来。