是否可以在派生类中实现多个重载方法,并像重写方法一样进行调用?我找不到有关此主题的任何内容。
简短示例:
class BaseClass
{
public virtual void Do(object o)
{
DoNothing();
}
}
class ChildClass : BaseClass
{
public override void Do(object o)
{
Write("Something");
}
public void Do(string s) //override?, new?
{
Write(s);
}
}
我知道我可以从派生对象调用 Do(string s):
ChildClass c = new ChildClass();
c.Do("text");
结果:
"text"
但是当我们覆盖时它会调用
Do(object o)
BaseClass c = new ChildClass();
c.Do("text");
结果:
"Something"
我希望我能避免这样做:
public override void Do(object o)
{
if (o is string)
Write(s);
else
Write("Something");
}
这是不可能的,因为虚拟方法调用粗略地说是对对象运行时类型的“vtable”中给定“slot”编号的方法的调用(VTable是特定类型的方法表,link到 vtable CLR 源代码)。所以槽号指向特定的方法,它不能映射到派生类中的两个或多个方法。
作为解决方法,您可以使用
dynamic
实例,如下所示,但速度会明显变慢:
BaseClass a = new ChildClass();
a.Do(""); // invokes ChildClass.Do(object)
dynamic b = new ChildClass();
b.Do(""); // invokes ChildClass.Do(string)