调用隐藏接口方法
Calling hidden interface method
我尝试使用新的 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
我希望在第二次调用中看到 "Call from interface" 类似于在第二个示例中使用正常继承时的情况。
总结一下:
为什么接口方法被隐藏了,(也许)我怎么还能调用它。
此外,这是我的第一个问题,欢迎任何提示
Why is the interface method hidden?
默认接口方法就是这样。如果没有提供其他实现,接口中的方法是默认实现。
在您的每一个案例中,您都提供了一个实现,因此不会使用默认值。
当您提供非默认实现时,我们假设新实现比默认实现更好;如果不是更好,你不会提供它,对吧?您不会无缘无故地完成工作,并且大概您希望您的工作得到使用。当存在更好的实现时,运行时调用默认实现是愚蠢的。
How can I still call it?
在你的代码中,你没有。
如果您希望始终有一个可以调用的默认实现,您可以这样做:
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
。
我尝试使用新的 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
我希望在第二次调用中看到 "Call from interface" 类似于在第二个示例中使用正常继承时的情况。
总结一下:
为什么接口方法被隐藏了,(也许)我怎么还能调用它。
此外,这是我的第一个问题,欢迎任何提示
Why is the interface method hidden?
默认接口方法就是这样。如果没有提供其他实现,接口中的方法是默认实现。
在您的每一个案例中,您都提供了一个实现,因此不会使用默认值。
当您提供非默认实现时,我们假设新实现比默认实现更好;如果不是更好,你不会提供它,对吧?您不会无缘无故地完成工作,并且大概您希望您的工作得到使用。当存在更好的实现时,运行时调用默认实现是愚蠢的。
How can I still call it?
在你的代码中,你没有。
如果您希望始终有一个可以调用的默认实现,您可以这样做:
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
。