c# - C# 8 默认接口实现是否允许多重继承
问题描述
根据https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/,C# 8 中的新功能之一是接口的默认实现。这个新特性是否也隐含地允许多重继承?如果没有,如果我尝试以下操作会发生什么:
public interface A { int Foo() => 1; }
public interface B { int Foo() => 2; }
public class C : A, B { }
解决方案
Mads Torgersen 在您链接到的博客文章中回答了您的问题:
实际上接口离抽象类还很远。类不从接口继承成员,所以如果一个类留下一个由接口实现的成员 M,则该类没有成员 M!这就像今天的显式实现;您必须转换为界面才能获得此类成员。
所以用你的例子:
public interface A { int Foo() => 1; }
public interface B { int Foo() => 2; }
public class C : A, B { }
你不能做这个:
var something = new C();
var x = something.Foo(); /* does not compile */
您可以执行以下操作:
var something = new C();
var x = ((A)something).Foo(); /* calls the implementation provided by A */
var y = ((B)something).Foo(); /* calls the implementation provided by B */
推荐阅读
- java - 确定两个元素是否位于二维数组的同一行或同一列中的最快方法是什么?
- c++ - 纯虚函数的继承
- c# - 迭代 ReadOnlySequence 的 ReadOnlySequenceSegment 并返回 ArrayPool
- typescript - 将嵌套的命名空间/枚举作为字符串
- c# - 从 PRISM 模块化应用程序中的 WPF 视图模型调用消息警报
- java - 禁止移动,在 Java 中的 Minecraft 上的 GUI 中添加项目
- amazon-web-services - AWS amplify 为 2 个不同的放大应用程序配置子域
- c# - EF Core 删除未提交迁移的正确方法
- reactjs - ReactJS,渲染循环中子级和父级之间的道具
- angular - 现有 Angular 11 应用上的 Angular Universal