假设我们有两个界面:
interface Ilayer1 : Ilayer2
{
string testMethod1();
}
interface Ilayer2
{
string testMethod2();
}
class A: Ilayer1
{
...//implement all methods of Ilayer 1 and Ilayer2
}
所以我的问题是:
Ilayer1
继承自Ilayer2
会得到什么? Ilayer1
和Ilayer2
之间的继承关系,只需让类A将两个接口都实现为class A: Ilayer1, Ilayer2
答案 0 :(得分:2)
这与类之间的继承具有相同的语义。
在OOP世界中,派生类型当继承基类型的特定版本时,继承基类型-无论该类型是接口还是类,其原理都保持不变。
这是.Net框架中的一个示例:IList
接口继承了ICollection接口,该接口继承了IEnumerable接口。
IEnumerable
接口提供使用GetEnumerator()
循环进行枚举所需的foreach
方法。
ICollection
添加了新功能:Count
属性和CopyTo
方法。
IList
增加了更多功能-索引器,Add
和Remove
方法等等。
因此IList
是ICollection
的一种更具体的类型,它是IEnumerable
的一种更具体的类型。
接口可以互相继承的事实意味着您不仅可以在接口上而且可以在类上也拥有polymorphic的观点-当处理多个相互继承的接口时,这可以大大简化您的代码。
这样做的另一个好处是,您可以在接口上声明扩展方法,并通过实现继承接口的接口直接或间接地在实现该接口的任何类上使用它,就像在类中一样。
关于为什么不删除继承并分别实现两个接口的问题-如果接口不相关,这是有意义的,例如Control
类(在System.Windows.Forms中) )-它实现了许多不相关的接口,例如IDropTarget
和IComponent
。
答案 1 :(得分:1)
一个真实的例子:
interface IShape
{
double X { get; }
double Y { get; }
}
interface IAreaShape : IShape
{
double GetArea();
}
interface IPerimeterShape : IShape
{
double GetPerimeter();
}
现在假定您具有Rectangle : IAreaShape, IPerimeterShape
形状,并且可以计算其“面积”和“周长”。当您拥有IAreaShape
或IPerimeterShape
类型的对象时,它必须是IShape
。这是您第二个问题的答案。
现在,对于您的第一个问题,仅假设为示例起见,我们有一个Circle
,我只能计算面积,而不能计算周长。在这种情况下,我们只需声明为Circle : IAreaShape
。
对于管理而言:List<IShape> shapes
可以同时使用Circle和Rectangle以及任何东西,只要它们实现IShape
(或IShape
的任何派生类型)即可。如果您不在乎是否可以计算其面积或周长,则可以执行此操作,但是始终可以获取其X和Y坐标。
答案 2 :(得分:0)
Ilayer1
继承了Ilayer2
,这意味着实现Ilayer1
的任何人都需要实现testMethod1()
和 testMethod2()
。 为什么?为什么不?因为我们可以?我认为,在具有大量接口的大型项目中,如果您需要指定某个类正在单独实现的所有接口,则可能会变得非常乏味(尽管在SOLID设计中,一个类通常不应该实现多个接口) 。因此,您可以通过使接口实现其他接口来对接口进行“分组”。您还可以通过使用接口继承'version' an interface。接口可以从其他接口继承。一个类可能通过其继承的基类或通过其他接口继承的接口多次包含一个接口。但是,只有在类将接口声明为类定义(
class ClassName : InterfaceName
的一部分时,该类才能一次提供接口的实现。如果由于继承了实现该接口的基类而继承了该接口,则该基类将提供该接口成员的实现。但是,派生类可以重新实现任何虚拟接口成员,而不必使用继承的实现。 Source