为什么在C#8中更改了默认接口方法的行为?
过去,以下代码(当未发布默认接口方法的演示时):
interface IDefaultInterfaceMethod
{
// By default, this method will be virtual, and the virtual keyword can be here used!
virtual void DefaultMethod()
{
Console.WriteLine("I am a default method in the interface!");
}
}
interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
void IDefaultInterfaceMethod.DefaultMethod()
{
Console.WriteLine("I am an overridden default method!");
}
}
class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}
class Program
{
static void Main()
{
IDefaultInterfaceMethod anyClass = new AnyClass();
anyClass.DefaultMethod();
IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
anyClassOverridden.DefaultMethod();
}
}
具有以下输出:
控制台输出:
我是界面中的默认方法!
我是一个覆盖的默认方法!
但是,使用最新版本的C#8,上面的代码将产生以下输出:
控制台输出:
我是一个覆盖的默认方法!
我是一个覆盖的默认方法!
任何人都可以向我解释为什么这种行为会改变?
注意:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
参考方案
我怀疑一个更好的问题是:
如何调用默认方法而不是具体实现?
该功能是经过计划的,但为cut from C# 8 in April 2019,因为有效的实现需要运行时的支持。无法在发布前及时添加。该功能必须同时适用于C#和VB.NET-F#仍然不喜欢接口。
如果运行时不存在B.M,则将调用A.M()。对于base()和interfaces,运行时不支持此功能,因此调用将引发异常。我们想在运行时中添加对此的支持,但是发布此版本太昂贵了。
我们有一些解决方法,但是它们没有我们想要的行为,也不是首选的代码生成器。
尽管不是我们想要的那样,我们对C#的实现还是可行的,但是VB的实现会困难得多。此外,VB的实现将要求接口实现方法是公共API表面。
through a base()
call的工作方式类似于类的工作方式。合作提案示例:
interface I1
{
void M(int) { }
}
interface I2
{
void M(short) { }
}
interface I3
{
override void I1.M(int) { }
}
interface I4 : I3
{
void M2()
{
base(I3).M(0) // What does this do?
}
}
从Java接口中的默认方法调用方法 - java这可能是愚蠢的问题。但我想知道这样做的可能性。假设我有类似的界面public interface GroupIdentifier { Integer getRevision(); } 我需要另一个名为getNextRevision的方法。所以我能做的是,在同一接口内实现默认方法并返回下一个数字。例如:public interface GroupIdentif…
LeetCode题解计算机为什么是基于二进制的?可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制
LeetCode题解统计城市的所有灯泡这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…
LeetCode题解黑白圆盘一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可
LeetCode题解圆上任取三点构成锐角三角形的概率来自字节跳动的一道几何题题解:1/4