假设我有以下功能:
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# 接口中不能有“虚拟”方法,但 C# 8.0 引入了默认接口方法。这些有点像虚拟方法,但用于接口。
您可以使用
new
关键字使接口中的默认方法直接在您的类中使用。它将隐藏接口中的方法并将调用转发到接口自己的方法。