抽象类被描述为对一族物体有用(例如可用于哺乳动物的动物)。但是,使用接口或抽象类来表示一系列相关对象之间有什么区别?
当我想要定义常用功能但使用未来扩展选项和自定义功能(实现)接口时,我的过程是使用抽象类。
例如,我编写了一个抽象类来封装一些数据库功能,这些功能将在工作中的小型Web应用程序中大量使用。我用虚拟方法编写了一个抽象类,可以在将来用自定义功能覆盖(例如,记录,或者可能需要报告数据库事件)。
这是正确的方法吗?选择一个构造(抽象或界面)来表示一个家庭有什么意义吗?
答案 0 :(得分:3)
当所有类型之间存在共同的状态和行为时,应使用抽象类。当所有类型都具有公共接口但不共享状态或行为时,应使用接口。
以下是一个示例。
德国牧羊犬,金毛猎犬,比格犬
这三个对象都是狗,因此它们共享某些共同状态(食肉,4条腿等),并且它们也具有某些可覆盖的行为(树皮,裤子等)。在这种情况下,最有意义的是创建一个抽象的Dog类来保存这种常见的状态和行为,并为每种类型的狗创建Dog的子类型。
铅笔,钢笔,粉笔
这些对象没有共同状态,也无法共享行为。然而,你可能会注意到他们确实有一些共同点 - 他们是写作的小册子。这些对象最好单独构建,没有基类,然后用Writable
接口绑定在一起,公开每种类型的Write
方法。
答案 1 :(得分:0)
我建议使用接口,以便您可以在以后的某个时间点在数据库实用程序中实现新功能。
与往常一样,开发的主要设计原则是
设计接口,而不是实现
答案 2 :(得分:0)
使用抽象类,您可以提供层次结构中所有类所需和共享的实现。因此,您正在重用代码。您可以允许派生类覆盖默认行为,但至少您要为新生动物提供呼吸等基线功能。但是,对于接口,您无法提供任何实现。您只需定义一个合同,继承该接口的所有类都应该遵守并提供实现。这可能会导致类层次结构中重复和重复的代码。
接口不是很好的可扩展性,您需要担心版本控制。您决定对现有界面进行更改,但您很快就会意识到存在许多可能需要修改的类。考虑将呼吸方法添加到已被许多哺乳动物使用的IMammal界面中。您将需要为每个人提供呼吸实施。使用抽象类,您只需添加Breath方法并提供一些基线实现,而无需担心现有的派生类。因此,抽象类在层次结构和api的开发方面更灵活。