【发布时间】:2017-01-15 17:55:03
【问题描述】:
我们需要有轻型/重型汽车的实例和北极轻型/重型汽车的实例。不将ArcticCar代码复制到ArcticLight/HeavyCar中的正确继承(或组合?)方式是什么?
class Car {
startEnging() {
turnOnPeripheralDevices();
checkFuelLevel();
// + other default actions. Some of them can be overrided in child classes to add specific actions
log("engine started");
}
/* Common car stuff */
}
class LightCar extend Car {
override startEngine() {
log("light car prepare to start");
parent.startEnging();
}
/* Basic light car stuff */
}
class HeavyCar extend Car {
override startEngine() {
turnOnLights();
log("heavy car prepare to start");
parent.startEnging();
}
override turnOnPeripheralDevices() {
parent.turnOnPeripheralDevices(); //Car's default actions
// additional actions for HeavyCars only
}
/* Basic heavy car stuff */
}
class ArcticCar extend Car {
override startEngine() {
warmUpEngine()
wait10seconds();
log("arctic mode: warming up engine");
parent.startEnging();
}
/* A lot of common stuff for arctic cars. Can overwrite some common Car's functions */
}
class LightArcticCar extend **LightCar, ArcticCar** {
override startEngine() {
log("arctic ligh car prepare to start");
parent.startEnging();
}
/* Arctic light car stuff. Can overwrite some specific LightCar's functions */
}
class HeavyArcticCar extend **HeavyCar, ArcticCar** {
override startEngine() {
if(checkForecast())
parent.startEnging();
}
override turnOnPeripheralDevices() {
parent.turnOnPeripheralDevices(); //Car's + HeavyCar's default actions
// additional actions of HeavyArctic car
}
/* Arctic heavy car stuff. Can overwrite some specific HeavyCar's functions */
}
class Main {
buggy = new LightCar();
awdSUV = new HeavyCar();
snowmobile = new ArcticLightCar();
mobileLaboratory = new ArcticHeavyCar();
}
【问题讨论】:
-
支持组合胜于继承
-
可能是装饰器模式的好地方en.wikipedia.org/wiki/Decorator_pattern
-
除非您在
HeavyArcticCar中明确表示,否则您怎么知道是在预热发动机之前还是之后打开灯? -
@lhoworko 用于装饰器模式:HeavyArcticCar 必须实现 Car、HeavyCar 和 ArcticCar 类的所有公共方法,即使我只覆盖了一个父类的方法。
-
@jaco0646:
HeavyAcrticCar应该同时扩展AcrticCar和HeavyCar类:)
标签: java oop inheritance design-patterns