【发布时间】:2017-11-09 19:23:07
【问题描述】:
如果一个类从两个独立的接口实现了一个接口,它的行为是否就好像它只实现了一次一样?
例子:
public interface IAnimal { /* ... */ }
public interface IFullAnimal : IAnimal { /* ... */ }
public interface IBear : IAnimal { /* ... */ }
public interface IFullBear : IBear, IFullAnimal { /* ... */ }
// and implementing IFullBear:
public class FullBear : IFullBear { /* ... */ }
在上面,FullBear 从IFullAnimal 和IBear 到IFullBear 都实现了IAnimal。这是否会引入有关 IAnimal 实现的任何奇怪行为因为IFullAnimal 和IBear 都没有提供有关IAnimal 实现的任何信息(因为语言不允许这样做)。
【问题讨论】:
-
interface IA { } interface IB : IA { } interface IC : IA, IB { }怎么样。这与实施有什么关系?您正在做出多个承诺,即该类具有成员IAnimal承诺。好的。 -
IFullBear没有实现任何东西,它是一个接口。 -
所以,你是说:“无论实现我什么都必须实现
IAnimal”的多个承诺不能潜在地导致IAnimal中声明的方法/属性的多个实现? -
多个实现从何而来?一个类实现或不实现接口。为什么语言的设计者会这样设计它?为什么编译器会对如此容易检测的事情保持沉默?
-
不要将此与 C++ 多重继承混为一谈。 C# 专门禁止从多个类继承,因此同一个类中不能有多个冲突的实现,特别是为了防止 C++ 菱形继承问题。
标签: c# inheritance diamond-problem interface-implementation