给定以下接口:
interface IFoo { void Foo(); } interface IBar : IFoo { void Bar(); }
表示给定类实现的最佳方法是什么IBar
?
class Implementation : IBar { ... }
这看起来更简单,更清晰,但并不表示Implementation
实现IFoo
.
class Implementation : IBar, IFoo { ... }
这似乎是最丰富的信息,但真正需要的额外信息?
编译器不需要额外的信息,但它可能对您的代码的读者有所帮助,因为读者不必知道IBar
扩展IFoo
.此框架中的一个例子是List
一个实现
,ICollection
以及IEnumerable
,即使IList
; 延伸ICollection
和IEnumerable
.
编辑:我认为,至少对我来说,我列出这两者的主要原因是你通常不会想到接口彼此继承.从类派生时,您希望继承本身可以继承的行为.如果您感兴趣,可以按照类层次结构进行推导.使用接口时,接口的派生更加不寻常,因此您不太可能看起来并且更有可能错过连接.列出它们都可以解决这个问题而不会有太多痛苦.
就个人而言,我会选择前者.对于后者,假设你在这种情况下你有一堆派生类:
class DerivedA : Implementation, IBar, IFoo { ... } class DerivedB : Implementation, IBar, IFoo { ... } class DerivedC : Implementation, IBar, IFoo { ... } class DerivedD : Implementation, IBar, IFoo { ... }
然后你的Implementation
变更要求,以便它现在需要实现另一个接口,例如IBaz
(只要它提供非抽象的实现,它可以做而不必影响任何派生类),那么你有两个选择:
保留所有派生类定义,而不显式声明新接口信息,在这种情况下,类定义现在根据标准不正确,如果人们希望始终遵循标准,则可能会产生误导.
去查找所有派生类及其所有派生类,并修复它们的声明.这需要时间,有点容易出错并且难以完全完成,并且将您的单个文件更改为多文件签入.
这些选项都没有吸引力,所以我选择不会让你陷入困境的选项.只需声明派生最多的接口.