毕竟任何java抽象都是Object的抽象子类。有时我们需要强制子类实现一些方法,但可能已经有一个非常明确的层次结构与具体的类。
例如:我有一个运作良好的层次结构 车辆< --- Car
现在我想将ElectricCar添加到此层次结构中。
车辆LT; - 汽车< - ElectricCar。
我也希望所有不同类型的电动汽车能够实现某些行为,例如getBatteryLife或其他东西 -
为什么让ElectricCar抽象是一个坏主意?
答案 0 :(得分:2)
将它抽象化是没有错的。如果您的业务要求您将其抽象化,那就没问题了。就像你说的那样,Java lib中的许多类都是抽象的,仍然在扩展Object。
答案 1 :(得分:1)
本身并不坏。不常见,但不坏。我唯一能想到的就是可理解性:如果我看到一个可以实例化的具体类Car,我通常会认为它的任何子代也是可实例化的,因为99%的代码都是这样工作的。然后我就会感到困惑一秒钟,关于无法实例化ElectricCar。
答案 2 :(得分:1)
可以说这种模式打破了Liskov Substituion Principle,因为如果它被声明为抽象的话,你无法通过“CarCar”传递“CarCar”(当然你可以传递ElectricCar子类的实例)。
在这个特殊的例子中,混凝土电动车(氢动力/插件/等?)我希望直接从“Car”继承,因为它们满足“is-a”关系并且是“适当的专业化”汽车”。如果您想描述一些他们应该提供的常见行为和特征,那么他们还应该实现一个ElectricCar 接口。
您真正想要的是能够继承Car(因为它就是这样)和共享/重复使用电动汽车相关方法的常见实现。在这种情况下,您正在查看多继承问题或mixins的需求,这两者都不是Java直接支持的。
在具体的层次结构中间提供一个抽象类可能是解决这个问题的一种方法,但它并不漂亮。
答案 3 :(得分:0)
我个人更喜欢为ElectricCar定义一个接口,然后允许实现类定义方法。然后,您可以通过其他机制分享getBatteryLife的行为。
我已经构建了一些非常深层次的继承层次结构,我倾向于避免它们随着时间的推移而逐渐形成的脆弱性。一个Base类可能有意义,但是如果可能的话,我会考虑如何编写对象模型来共享没有继承的行为。
答案 4 :(得分:0)
在你的例子中我会说,Car
类应该是抽象的(或接口)。但ElectricCar
是抽象的,没有任何问题。