直接从实现的类访问接口中的虚拟函数

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

假设我有以下功能:

public interface MyInterface
{
    int GetNumber();
    virtual int GetTwiceNumber()
        => 2 * GetNumber();
}

我可以在类中实现接口:

public class MyClass
    : MyInterface
{
    public int GetNumber()
        => 5;
}

我可以直接通过类访问

GetNumber
函数,但我必须通过将
GetTwiceNumber
重新解释为
MyClass
来访问
MyInterface
函数:

MyClass myObject = new();
Console.WriteLine(((MyInterface)myObject).GetTwiceNumber());

输出:

10

我想让

MyInterface.GetTwiceNumber
可以从课堂上直接访问。在此示例中,我可能只需将函数的代码复制到类中,但对于较大的函数,这是不切实际的。此外,如果一个函数被编辑,而另一个函数没有被编辑,这可能会导致难以追踪的错误。

我想到:

public int GetTwiceNumber()
    => 2 * ((MyInterface)this).GetNumber();

但是,这样做的问题是,一旦我在类中创建与实现的虚函数同名的函数,它将覆盖该虚函数,从而不允许我访问接口中定义的虚函数。结果,上面的代码只会抛出一个

StackOverloadException

如何允许通过实现的类直接访问接口中定义的虚函数,而不是要求用户将类重新解释为该接口(假设该类尚未覆盖虚函数)?

c# class interface overriding interface-implementation
1个回答
0
投票

C# 接口中不能有“虚拟”方法,但 C# 8.0 引入了默认接口方法。这些有点像虚拟方法,但用于接口。

您可以使用

new
关键字使接口中的默认方法直接在您的类中使用。它将隐藏接口中的方法并将调用转发到接口自己的方法。

© www.soinside.com 2019 - 2024. All rights reserved.