C#“new”关键字[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

这是Micosoft对new关键字的定义:“警告说DerivedClass中的Method2方法隐藏了BaseClass中的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关键字解决我对这个“基类实现隐藏”的困惑的任何答案。谢谢大家!

c# inheritance polymorphism keyword
2个回答
1
投票

为什么它使用基类的实现而不是派生类的实现

使用'new',当调用基类变量时,它将调用基类的实现。在派生类变量上调用时,它将调用派生类的实现。

Derived d = new Derived();
Base b = d;

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

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

Derived d = new Derived();
Base b = d;

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

0
投票

我会这样思考:

Derived隐藏基类Base的成员,并且您通过Derived访问时,调用Deriveds,因为它隐藏了Bases实现。然而,当通过Base时没有任何隐藏它,所以使用Bases实现。

但是,使用virtual/override(多态)Bases方法实际上被覆盖,而不是隐藏,所以即使通过Derived引用访问它也会使用Bases方法。

(也可能是真正的原因):命名事情很难。程序员和其他人一样糟糕。

© www.soinside.com 2019 - 2024. All rights reserved.