我不一定会看到继承接口的接口带来的巨大好处。
考虑以下三个接口,第三个继承另外两个接口
interface IOne {
}
interface ITwo {
}
// interface inheritance
interface IAll : IOne, ITwo {
}
最好
class C : IOne, ITwo { ... }
或
class C : IAll { ... }
如果后者可能有益,那么为什么不创建IAll来拥有IOne和ITwo的所有方法而不继承它们呢?毕竟它是一个界面。
接口继承是否实用,不仅有用吗?
答案 0 :(得分:6)
考虑接口“继承”的好方法是完全忘记它被称为“继承”。毕竟,“基础”界面显然没有为“派生”界面提供功能;它所贡献的只是承诺会有某些成员。
类派生关系通常意味着“is-a-kind-of”关系。 NullReferenceException是一种异常。界面派生关系并不意味着完全没有意义 - 说IEnumerable<T>
是一种IDisposable
是没有意义的。
相反,接口继承意味着“实现IEnumerable<T>
的类型也需要实现IDisposable
。也就是说,接口继承并不意味着”这是一种“,而是”每一个“实现这一点也需要实现“。
这会让它更引人注目吗?
答案 1 :(得分:2)
做什么是语义正确的。不要只是为了在额外的界面中保存输入。
如果'IAll'是一个在你的程序中有意义的概念,那很好,使用它。如果它只是一种不键入'IFirst,ISecond'的方法,那就不要这样做。
答案 2 :(得分:1)
可能有一些方法需要IAll
参数 - 所以如果你满足实现整个IAll
的要求,那么这样做很方便,而不是仅仅实现每个接口延伸!
通常,接口当然不是空的,因此在实现一个和/或另一个时需要特定的(可能很小的)成本(需要实现不同的,多个方法)。例如,如果IFirst
有方法foo
,而ISecond
有方法bar
,则将两者都扩展为IBoth
是完全合理的不添加进一步需要的方法 - 它允许方法清楚地表明它需要一个具有两个方法的参数,foo
和 {{1} }。
如果世界上的每个界面都是空的,那么它们的使用(更不用扩展它们的空接口)将 当然更可疑! - )
答案 3 :(得分:1)
是的,接口继承是实用的。接口背后的想法是单个接口定义了一个松散的“契约”,描述了一组特定的功能。这样可以非常清晰地分离功能。
通常,需要实现多个接口的类通过单独列出每个接口来实现,例如:
class C : IOne, ITwo { ... }
如果您需要能够从多个接口聚合功能,那么您可能希望创建一个继承其他接口的接口(如IAll
接口)。虽然你可以这样做,但你通常不需要(或不想)这样做。
答案 4 :(得分:0)
我会采用第一种方法,对我来说更清楚。第二个似乎做作,IMO。