C# C“新”关键字

C# C“新”关键字,c#,inheritance,polymorphism,keyword,C#,Inheritance,Polymorphism,Keyword,这是Micosoft对new关键字的定义:警告说DerivedClass中的Method2方法隐藏了BaseClass中的Method2方法。 我似乎无法理解为什么它被定义为隐藏基类的实现。如果它实际上隐藏了基类的实现,为什么它使用基类的实现而不是派生类的实现?在我看来,隐藏一词的使用与它的实际工作方式相矛盾,而这种解释倾向于关键字覆盖的实际作用;使用派生类的实现而不是基类的实现 Derived d = new Derived(); Base b = d; d.Foo(); //<-

这是Micosoft对new关键字的定义:警告说DerivedClass中的Method2方法隐藏了BaseClass中的Method2方法。

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

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

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

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

我会这样想:

当派生隐藏基类base的一个成员,并且您通过派生类进行访问时,会调用Deriveds,因为它隐藏了base实现。然而,当通过Base时,并没有任何东西隐藏它,所以使用了Bases实现

然而,对于虚/重写多态性,方法实际上是重写的,而不是隐藏的,所以即使通过基引用访问,它也将使用Deriveds方法

还有可能是真正的原因:命名事物很难。程序员在这方面和其他人一样糟糕

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

使用“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

这就是我所想的,调用A是因为它隐藏了B的实现。但是,根据Microsoft的定义,new关键字隐藏了基类实现,在本例中,基类实现会将您的语句重新表述为A的调用,因为它隐藏了A的实现。@97nico在本例中,A是派生类。此外,不能隐藏自己的实现。不知道你的评论是什么意思如果我的评论把你弄糊涂了,我道歉。我搞不清楚A或B是基类还是派生类。如果A的驱动类函数声明为新函数,而B的基类函数声明为虚拟函数,则调用A.function将运行B的函数,对吗?@97nico No.virtual只是表示可以重写它。新的方法仍然可以进行标准的方法隐藏。我真的很抱歉,我无法清楚地表达我的想法。如果B基=派生;base.function将运行B的函数,对吗?我知道它是如何工作的。对不起,但显然你没有。新建创建一个与隐藏成员完全相同的名称的成员。但是,除非将该实例强制转换为基类,否则无法访问隐藏成员。事实上,你有两个名字完全相同的成员,所以你必须以某种方式表明你想使用哪一个。好吧,我很抱歉,我声称已经理解了这个概念。我的困惑似乎是Base=derived,Base有虚拟的Foo,而derived有新的Foo。为什么base.Foo在关键字new隐藏base的Foo时使用base的Foo。它从base隐藏子类实现,因此base不知道derivedYes实现的Foo。是的,我理解使用new时,它将调用基类实现,而不是派生的实现。但是为什么说它隐藏了基类的实现呢?这个定义让我想到,因为b的Foo是隐藏的,所以b=d;b、 傅;将调用d的Foo而不是b的Foo,这类似于关键字覆盖实际上是在做什么。隐藏在放在前面的意义上,但不是替换。啊,放在前面似乎是我在寻找的答案。只是想澄清一下,我认为隐藏意味着为d的Foo添加关键字new会将b的Foo放在d的Foo前面,这是正确的吗?因此,如果Base b=d,调用b.Foo将运行b的Foo,即使d也有Foo的实现,因为b的Foo放在d的Foo之前?@97nico我相信你的结论是正确的,但逻辑是错误的。d在b前面。当你有一个b引用,你经过dSo,我这次认为b.Foo会运行b的Foo而不是D的Foo,因为变量是b类型的,而D的Foo被认为是一个新的,与b的Foo完全无关的函数,因为新的关键字?