重载重写的方法

Overloading an overriden method

提问人:kallinea rae 提问时间:10/25/2023 最后编辑:kallinea rae 更新时间:10/25/2023 访问量:83

问:

是否可以在派生类中实现多个重载方法,这些方法将像重写方法一样调用?我找不到关于这个话题的任何内容。

简短示例:

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# 继承重

评论

2赞 Good Night Nerd Pride 10/25/2023
如果你想提供那么你也必须在那里定义它。BaseClassDo(object)Do(string)
1赞 Guru Stron 10/25/2023
Base.Do将始终从继承层次结构中调用该方法。 对后代中定义的方法一无所知。因此,简而言之 - 除了更改覆盖(或在 中定义适当的方法)之外,不可能影响此行为。DoBaseChildBase
0赞 Panagiotis Kanavos 10/25/2023
你是超载的,不是.此外,明确表示您只想使用类方法ChildClass.DoBaseClass.DoBaseClass c
5赞 Guru Stron 10/25/2023
请注意,这可能是一个 XY 问题。您能更详细地解释一下您的真实案例吗?
0赞 Panagiotis Kanavos 10/25/2023
您可以将新方法定义为扩展方法BaseClass

答:

-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)