正在调用隐藏接口方法



我尝试使用新的C#默认接口方法。有人能解释以下代码以及为什么会发生这种情况吗?

最小测试示例:

public static void Main()
{
Class c = new Class();
IInterface i = new Class();
c.M1();
i.M1();
(i as IInterface).M1();
Class2 c2 = new Class2();
Class2Base c2b = new Class2();
c2.M2();
c2b.M2();
(c2 as Class2Base).M2();
}
public interface IInterface
{
public void M1() => Console.WriteLine("Call from interface");
}
public class Class : IInterface
{
public void M1() => Console.WriteLine("Call from class");
}
public class Class2 : Class2Base
{
public void M2() => Console.WriteLine("Call from class2");
}
public class Class2Base
{
public void M2() => Console.WriteLine("Call from class2base");
}

输出:

Call from class
Call from class
Call from class
Call from class2
Call from class2base
Call from class2base

我希望在第二个调用中看到"从接口调用",类似于第二个示例中使用普通继承时的情况。

总结:

为什么接口方法是隐藏的,(也许(我怎么还能调用它。

此外,这是我在这里的第一个问题,所以任何提示都欢迎

为什么接口方法被隐藏?

默认的接口方法就是这样。如果没有提供其他实现,则接口中的方法是默认实现。

在您的每一个案例中,都提供了一个实现,因此不会使用默认值。

当您提供非默认实现时,我们假设新实现比默认实现好;如果不是更好的话,你就不会提供了,对吧?你不会无缘无故地完成工作,大概你希望你的工作被使用。当存在更好的实现时,运行时调用默认实现是愚蠢的。

我怎么还能叫它?

在您的代码中,您没有。

如果你想总是有一个可以调用的默认实现,你可以做一些事情,比如:

public interface IInterface
{
public void M1() => MyHelperMethods.M1(this);
}
public static class MyHelperMethods
{
public static void M1(IInterface i) => 
Console.WriteLine("Call from static");
}

现在,如果您想调用默认实现,您可以直接调用MyHelperMethods.M1

最新更新