提问人:kallinea rae 提问时间:10/25/2023 最后编辑:kallinea rae 更新时间:10/25/2023 访问量:83
重载重写的方法
Overloading an overriden method
问:
是否可以在派生类中实现多个重载方法,这些方法将像重写方法一样调用?我找不到关于这个话题的任何内容。
简短示例:
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");
}
答:
-1赞
Renat
10/25/2023
#1
这是不可能的,因为运行时的虚拟方法调用大致上就是对对象的运行时类型的“vtable”中给定“槽”号的方法的调用(VTable 是特定类型的方法表,链接到 vtable CLR 源代码)。因此,插槽编号指向特定方法,它不能映射到派生类中的两个或多个方法。
作为解决方法,您可以使用如下所示的实例,但速度会明显变慢:dynamic
BaseClass a = new ChildClass();
a.Do(""); // invokes ChildClass.Do(object)
dynamic b = new ChildClass();
b.Do(""); // invokes ChildClass.Do(string)
评论
BaseClass
Do(object)
Do(string)
Base.Do
将始终从继承层次结构中调用该方法。 对后代中定义的方法一无所知。因此,简而言之 - 除了更改覆盖(或在 中定义适当的方法)之外,不可能影响此行为。Do
Base
Child
Base
ChildClass.Do
BaseClass.Do
BaseClass c
BaseClass