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 */

感谢@CodeCaster的精彩评论促成了这个答案

提案指出:

注意,类不会从其接口继承成员;那个此功能不会更改:

因此,似乎是合理的(尽管在发货之前无法100%确定(:

public interface A { int Foo() => return 1; }
public interface B { int Foo() => return 2; }
public class C : A, B { }

会很好用的。

正如提案所示:

new C().M(); // error: class 'C' does not contain a member 'M'

那么我们可以假设,你的版本:

new C().Foo();

也不会编译。

提案显示:

IA i = new C();
i.M();

有效,相当于您的:

A i = new C();
i.Foo();

由于i被声明为类型A,因此没有理由认为如果A被更改为B,则同样的方法将不起作用——没有冲突可言。

此功能的全部目的是允许以安全的方式扩展接口(请参阅本视频(。如果在实现一个接口的情况下,这有效,那么这似乎与该功能的目标相反。鉴于该功能的实现方式大致类似于显式接口实现(这就是为什么我们不能直接调用C.Foo()(,我认为我们可以合理地假设它很可能允许多接口实现。

相关内容

  • 没有找到相关文章

最新更新