重载被重写的方法

问题描述 投票:0回答:1

是否可以在派生类中实现多个重载方法,并像重写方法一样进行调用?我找不到有关此主题的任何内容。

简短示例:

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");
    }
c# inheritance overloading
1个回答
0
投票

这是不可能的,因为虚拟方法调用粗略地说是对对象运行时类型的“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)
© www.soinside.com 2019 - 2024. All rights reserved.