我有一个父母和一个孩子班.两者都有一个具有相同名称的方法,编译器允许它.我无法理解.如果父类具有相同名称的方法,为什么编译器未在子类中显示错误.我没有使用新的虚拟或覆盖方法.请帮助我理解为什么编译器没有在子类中显示错误?
class BaseClass
{
public string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public string SayHi()
{
return (base.SayHi() + " from derived");
}
}
Run Code Online (Sandbox Code Playgroud)
必须声明的基本方法,virtual如果你想override它的子类:
class BaseClass
{
public virtual string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public override string SayHi()
{
return (base.SayHi() + " from derived");
}
}
Run Code Online (Sandbox Code Playgroud)
如果基本方法未声明为虚拟,您实际上会收到编译器警告,告诉您正在尝试隐藏此基本方法.如果这是您的意图,您需要使用new关键字:
class BaseClass
{
public string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public new string SayHi()
{
return (base.SayHi() + " from derived");
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
为了更好地看到两者之间的区别,请看下面的例子.
第一个使用在子类中重写的基本虚方法:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
第二个隐藏基本方法:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15855 次 |
| 最近记录: |