抽象类与接口来表示一个家庭

时间:2009-04-25 15:23:42

标签: oop

抽象类被描述为对一族物体有用(例如可用于哺乳动物的动物)。但是,使用接口或抽象类来表示一系列相关对象之间有什么区别?

当我想要定义常用功能但使用未来扩展选项和自定义功能(实现)接口时,我的过程是使用抽象类。

例如,我编写了一个抽象类来封装一些数据库功能,这些功能将在工作中的小型Web应用程序中大量使用。我用虚拟方法编写了一个抽象类,可以在将来用自定义功能覆盖(例如,记录,或者可能需要报告数据库事件)。

这是正确的方法吗?选择一个构造(抽象或界面)来表示一个家庭有什么意义吗?

3 个答案:

答案 0 :(得分:3)

当所有类型之间存在共同的状态和行为时,应使用抽象类。当所有类型都具有公共接口但不共享状态或行为时,应使用接口。

以下是一个示例。

  

德国牧羊犬,金毛猎犬,比格犬

这三个对象都是狗,因此它们共享某些共同状态(食肉,4条腿等),并且它们也具有某些可覆盖的行为(树皮,裤子等)。在这种情况下,最有意义的是创建一个抽象的Dog类来保存这种常见的状态和行为,并为每种类型的狗创建Dog的子类型。

  

铅笔,钢笔,粉笔

这些对象没有共同状态,也无法共享行为。然而,你可能会注意到他们确实有一些共同点 - 他们是写作的小册子。这些对象最好单独构建,没有基类,然后用Writable接口绑定在一起,公开每种类型的Write方法。

答案 1 :(得分:0)

我建议使用接口,以便您可以在以后的某个时间点在数据库实用程序中实现新功能。

与往常一样,开发的主要设计原则是

设计接口,而不是实现

答案 2 :(得分:0)

使用抽象类,您可以提供层次结构中所有类所需和共享的实现。因此,您正在重用代码。您可以允许派生类覆盖默认行为,但至少您要为新生动物提供呼吸等基线功能。但是,对于接口,您无法提供任何实现。您只需定义一个合同,继承该接口的所有类都应该遵守并提供实现。这可能会导致类层次结构中重复和重复的代码。

接口不是很好的可扩展性,您需要担心版本控制。您决定对现有界面进行更改,但您很快就会意识到存在许多可能需要修改的类。考虑将呼吸方法添加到已被许多哺乳动物使用的IMammal界面中。您将需要为每个人提供呼吸实施。使用抽象类,您只需添加Breath方法并提供一些基线实现,而无需担心现有的派生类。因此,抽象类在层次结构和api的开发方面更灵活。