【发布时间】:2012-03-18 20:33:46
【问题描述】:
我正在与一位同事讨论,他坚持认为在 Java 和 C# 等语言中,没有任何理由使用纯抽象基类,因为它只是意味着您无法解决缺少多重继承的问题.
我觉得他在这点上是错误的,因为我一直认为一个事物如果是名词就是宾语,如果是动词就是接口。
例如,如果我想定义类型 Bird,我想在其中强制执行 fly 方法而不实现它,那么我会将其设为纯抽象类。
如果我想定义一个类型Flies,我会将其作为fly方法的接口。
Bird 可能实现Flies。
我错了吗?
编辑:
我能给出的唯一有力的论据来支持我的观点是,在未来的某个时候,设计可能需要改变,以便鸟类可以吃东西。如果所有的鸟都吃同样的东西,那么这需要添加到Bird,使其非纯抽象。
如果Bird 是一个接口,那么这个更改简直就是一场噩梦,因为我不知道从其他基类继承的东西是否也实现了我的Bird 接口,所以我不能只是重构我的问题.
【问题讨论】:
-
+1 - 好问题,我认为在抽象类用例的未来答案中将探讨许多合理的原因。
-
只是回答您问题的部分(因此没有发布答案):我不会说接口总是动词。 lot 使用接口来允许一个类向世界展示一个最适合作为名词建模的世界。看看
java.util中的一些接口:Comparator,Enumeration,List,Iterator,Map,... -
意见就像背面,每个人都有一个,有些人比其他人更好。我不认为将 OOP 与语法进行比较是正确的,但它很接近。
-
为了扩展这个类比,我会说接口是形容词而不是动词。接口描述了一个对象拥有的功能,抽象类描述了一个类的层次结构。
-
C#中的纯抽象类到底是什么?