调用隐藏接口方法

时间:2020-04-21 15:47:49

标签: c# c#-8.0

我尝试使用新的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

我希望在第二个调用中看到“从接口调用”,类似于在第二个示例中使用正常继承时。

总结:

为什么隐藏了接口方法,以及(也许)我怎么仍可以调用它。

这也是我的第一个问题,因此欢迎您提出任何提示

1 个答案:

答案 0 :(得分:3)

为什么隐藏接口方法?

默认接口方法就是这样。界面中的方法是未提供其他实现的默认实现

在每种情况下,您都提供了一个实现,因此将不使用默认值。

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

我怎么仍能称呼它?

在您的代码中,您没有。

如果您希望始终拥有可以调用的默认实现,则可以执行以下操作:

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

相关问题