可能重复:
why do we need the new keyword and why is the default behavior to hide and not override?
我有父母和子女。两者都有一个具有相同名称的方法,编译器允许它。我无法理解。如果父类具有相同名称的方法,为什么编译器未在子类中显示错误。我没有使用新的虚拟或覆盖方法。请帮助我理解为什么编译器没有在子类中显示错误?
class BaseClass
{
public string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public string SayHi()
{
return (base.SayHi() + " from derived");
}
}
答案 0 :(得分:9)
如果要在子类中virtual
,则必须将基本方法声明为override
:
class BaseClass
{
public virtual string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public override string SayHi()
{
return (base.SayHi() + " from derived");
}
}
如果基本方法未声明为虚拟,您实际上会收到编译器警告,告诉您正在尝试隐藏此基本方法。如果这是您的意图,则需要使用new
关键字:
class BaseClass
{
public string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public new string SayHi()
{
return (base.SayHi() + " from derived");
}
}
更新:
为了更好地看到两者之间的区别,请看下面的例子。
第一个使用在子类中重写的基本虚方法:
class BaseClass
{
public virtual string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public override string SayHi()
{
return (base.SayHi() + " from derived");
}
}
class Program
{
static void Main()
{
BaseClass d = new DerivedClass();
// the child SayHi method is invoked
Console.WriteLine(d.SayHi()); // prints "Hi from derived"
}
}
第二个隐藏基本方法:
class BaseClass
{
public string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public new string SayHi()
{
return (base.SayHi() + " from derived");
}
}
class Program
{
static void Main()
{
BaseClass d = new DerivedClass();
// the base SayHi method is invoked => no polymorphism
Console.WriteLine(d.SayHi()); // prints "Hi"
}
}
答案 1 :(得分:0)
由于该方法不是虚拟的,因此具有相同名称没有问题。 调用哪一个仅取决于引用的类型。
BaseClass o = new DerivedClass();
o. SayHi();
将返回“嗨”。
如果您将父方法声明为virtual
,那么您必须在子类中override
或将其设为new
(这是默认值)。
如果您覆盖它,上面的代码将返回“来自派生的Hi”。
如果你使它new
与它不是虚拟的那样相同。
答案 2 :(得分:0)
它被称为Name隐藏。请阅读 - Hiding through inheritance
上的MSDN文章