【发布时间】:2010-11-16 22:45:31
【问题描述】:
虽然某些指导方针规定,当您想为继承不明确的类 (IDomesticated) 定义协定时应使用接口,而当类是另一个类的扩展时应使用接口 (Cat : Mammal、@987654327 @),在某些情况下(在我看来)这些准则进入了灰色区域。
例如,假设我的实现是Cat : Pet。 Pet 是一个抽象类。是否应该将其扩展到Cat : Mammal, IDomesticated,其中Mammal 是一个抽象类,IDomesticated 是一个接口?还是我与KISS/YAGNI 原则有冲突(尽管我不确定将来是否会有Wolf 类,它不能从Pet 继承)?
远离隐喻的Cats 和Pets,假设我有一些类代表传入数据的来源。他们都需要以某种方式实现相同的基础。我可以在抽象的Source 类中实现一些通用代码并从中继承。我也可以只创建一个ISource 接口(对我来说感觉更“正确”)并在每个类中重新实现通用代码(不太直观)。最后,我可以通过创建抽象类和接口来“吃蛋糕”。什么是最好的?
这两种情况提出了只使用抽象类、只使用接口以及同时使用抽象类和接口的问题。这些都是有效的选择,还是有什么“规则”规定什么时候应该使用一个而不是另一个?
我想通过“同时使用抽象类和接口”来澄清这一点,其中包括它们本质上代表相同事物的情况(Source 和 ISource 都具有相同的成员),但是类在接口指定合同时添加通用功能。
另外值得注意的是,这个问题主要针对不支持多重继承的语言(例如.NET和Java)。
【问题讨论】:
-
我想指出,我确实看到了几个“接口与抽象类”的问题,但在这个问题中,我最感兴趣的是什么时候使用 both i> 接口和抽象类(如果这是一个有效的做法。)
标签: oop interface abstract-class