【发布时间】:2018-08-12 23:47:14
【问题描述】:
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它会将方法隐藏在派生类中, 如果您使用覆盖,则新实现将被计算在内,并且它是使用的那个,但我不明白为什么这不会发生 使用 properties ,根据我的理解,我应该期望 car 中的 base.Name 应该打印“Minivan”(因为隐藏了 Minivan 类中的派生名称),而 this.Name 将为空。 (据我所知)
此外,当我在 VS car.Name 中检查对象 car 时,即使它打印了 "Minivan" ,但这种行为对我来说似乎真的很奇怪。 谁能给我解释示例代码中发生的事情,或者任何人都可以提出一个更好的例子来说明如何真正看到新的和覆盖的属性以正确的方式工作,以便我理解,也许我的例子很糟糕。
提前致谢。
【问题讨论】:
-
该类实际上具有 两个 具有相同
Name的属性。你设置其中之一。你没有设置另一个。因此它是null。那有意义吗?哪个具体部分让您感到困惑。 -
当你覆盖它时,你扩展了现有的,当newing它时,你隐藏它。在
VB.Net中称为Shadowing。也许他们选择这个名字是为了提供一个更好的主意。 -
我的问题是,在属性中使用 new 和 override 有什么区别。好的 Jimi 我隐藏了它,但为什么我的实例车打印 this.Name 而它没有隐藏,它假设打印 base.Name 如果是我在 mi Minivan 类中隐藏 Name 的情况,为什么我有相同的行为?
-
whats the difference between using new and override in properties.你想要一个属性(即存储一个值)吗?使用override。你想要两个(即存储两个不同的值)吗?使用new。请记住,使用new几乎总是是错误的想法。默认使用override。 请注意,在许多情况下,您实际上并不需要 两者 - 只需将其声明在基类中并根据需要从继承类中读取/写入即可。 -
Car的实例是什么?Car car是Minivan类型,Car car2是ConveribleCar类型,这里。 根据我的理解,汽车中的 base.Name 应该打印“Minivan”(因为在 Minivan 类中隐藏了派生名称),而 this.Name 将为空。没有。谁在隐瞒谁?
标签: c# polymorphism overriding new-operator virtual-inheritance