关于继承:C#“new”关键字

C# “new” keyword

本问题已经有最佳答案,请猛点这里访问。

这是MicoSoft对new关键字的定义:"警告说派生类中的method2方法隐藏了基类中的method2方法。"(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-and-new-keywords)

我似乎无法理解为什么它被定义为"隐藏基类的实现"。如果它实际上"隐藏"了基类的实现,为什么它使用基类的实现而不是派生类的实现?在我看来,"hide"一词的使用与它实际的工作方式相矛盾,而且这种解释倾向于关键字override实际正在做什么;使用派生类的实现而不是基类的实现。

如果有任何答案可以通过使用new关键字消除我对这个"基类实现隐藏"的困惑,我将不胜感激。谢谢大家!


Why does it use base class' implementation instead of derived class' implementation

当对基类变量调用"new"时,它将调用基类的实现。当调用派生类变量时,它将调用派生类的实现。

1
2
3
4
5
Derived d = new Derived();
Base b = d;

d.Foo(); //<- Derived's implementation
b.Foo(); //<- Base's implementation

在这两种情况下,都使用"override"调用派生类的实现。

1
2
3
4
5
Derived d = new Derived();
Base b = d;

d.Foo(); //<- Derived's implementation
b.Foo(); //<- Derived's implementation


我会这样想:

Derived隐藏基类Base的成员,并且通过Derived访问时,调用Derived是因为它隐藏Base的实现。但是,当通过Base时,没有任何东西可以隐藏它,因此使用Base的实现。

但是,对于virtual/override的(多态性)方法,Base的方法实际上是被重写的,而不是隐藏的,因此即使通过Base引用访问,它也将使用Derived的方法。

还有(可能是真正的原因):命名事物很难。程序员和其他人一样不擅长它。