我必须为以下场景选择设计模式。虽然我将在Typescript中实现它,但我需要使它成为通用的,以便跨语言实现它。
问题陈述是 - 让我们说我有功能driveInAir()
,driveOnRoad()
,driveOnWater()
等等。
现在我的类只包含子集或所有这些功能。例如 - 一辆飞行汽车可能有driveOnRoad和driveInAir,而一艘船可能只有driveOnWater。但是,这些功能的定义在各个类别中都很常见,因此我不想重新定义它们。
船舶也不应该能够访问driveOnRoad功能。我在Typescript中开发它,但所选择的设计模式也应该可以扩展到其他语言,如python,Java等。
其中一个理想的候选者是mixins,它是多重继承的另一种形式,我定义了一个只包含一个定义功能的函数的类。而Ship或FlyingCar类扩展了它所需的类。但是语言不支持mixins / multiple inheritance,所以它不是我的忠实粉丝。还有其他建议吗?
答案 0 :(得分:1)
我正在思考这个问题:
class Drive {
public driveInAir(vehicle: Vehicle): void {
console.log('Your ' + vehicle.Name + ' is flying!');
}
public driveOnRoad(vehicle: Vehicle): void {
console.log('Your ' + vehicle.Name + ' is driving on a road.');
}
public driveOnWater(vehicle: Vehicle): void {
console.log('Your ' + vehicle.Name + ' is motorboating!');
}
}
class Vehicle {
public Name: string;
}
class AirRoadVehicle extends Vehicle {
private _drive: Drive = new Drive();
driveInAir(): void {
this._drive.driveInAir(this);
}
driveOnRoad(): void {
this._drive.driveOnRoad(this);
}
}
class WaterVehicle extends Vehicle {
private _drive: Drive = new Drive();
driveOnWater(): void {
this._drive.driveOnWater(this);
}
}
class FlyingCar extends AirRoadVehicle {
constructor() {
super();
this.Name = 'Flying car';
}
goCrazy(): void {
this.driveOnRoad();
this.driveOnRoad();
this.driveInAir();
}
}
class Boat extends WaterVehicle {
constructor() {
super();
this.Name = 'Boat';
}
tryTakingTheHighroad(): void {
this.driveOnRoad(); //Property 'driveOnRoad' does not exist on type 'Boat'.
}
}
虽然你需要一些中产阶级来处理所有案件。
您可以尝试Here(运行时检查控制台输出)。