我在C#中有一个设计问题。
我有一个IAnimal接口(有一些方法)。 然后,我有一个IMammal和IReptile接口(继承了IAnimal接口)。
如果IMammal和IReptil类似乎都需要一种方法,该怎么办?
我不能将这种方法放在IAnimal界面中,因为它只涉及IMammal和IReptile(而没有其他动物),但是我没有两次定义此方法(听起来不是很好的习惯)。
答案 0 :(得分:2)
您所谈论的主要是接口隔离,因此,您可以定义一个单独的接口,而只有IMammal
和IReptil
可以实现,继承自。
或者,您也可以throw NotImplementedException()
处理其他与行为无关的类型。
答案 1 :(得分:0)
您有两个选择:
IMammal
和IReptile
都实现了IMammalReptile
,后者实现了IAnimal
。您在接口层次结构中创建一个附加级别。考虑到IMammal
是 IMammalReptile
IMammal
和IReptile
与IAnimal
一起实现。当您按照IMammal
行为类似的方式考虑这种关系时,这是很有意义的。在给定示例的特定情况下,选项2似乎可行。
答案 2 :(得分:0)
您可以创建IMammal
和IReptile
都实现的公共接口。但是实际上,我们不太可能编写处理所有这些嵌套类型的代码。它还可以将您粉刷到角落。某些东西将需要哺乳动物和爬行动物使用的通用方法,但它与某些较低级别的界面不兼容。
相反,请尝试创建诸如IMoveBehavior
,IEatBehavior
,IReproduceBehavior
之类的界面,并将各种行为放在自己的类中。
这样,如果您想要给定的IMoveBehavior
实现,则可以在任何类型的动物中使用它,即使它与使用该行为的其他动物没有其他共同之处。
您仍然可以使用继承。也许您是根据各种行为来“组成”青蛙,而现在您需要不同类型的青蛙。它们可能有很多共同点,因此继承才有意义。但是最好从组合开始,然后看看是否出现了继承对我们有利的模式。如果我们从继承开始,那往往会使我们绊倒。