Javascript 需要一种设计模式,以便只获得跨类通用的特定特性

Javascript 需要一种设计模式,以便只获得跨类通用的特定特性,javascript,python-2.7,typescript,design-patterns,Javascript,Python 2.7,Typescript,Design Patterns,我必须为以下场景选择一种设计模式。虽然我将在Typescript中实现它,但我需要使它通用,以便跨语言实现它 问题是——假设我有一些功能driveInAir(),driveOnRoad(),driveOnWater(),等等 现在我的类只包含这些特性的子集或全部。例如,一辆飞车可能在公路上行驶,在空中行驶,而一艘船可能在水上行驶。然而,这些功能的定义在不同的类中是通用的,因此我不想重新定义它们 此外,船舶不应能够访问driveOnRoad功能。我正在用Typescript开发它,但是选择的设计模

我必须为以下场景选择一种设计模式。虽然我将在Typescript中实现它,但我需要使它通用,以便跨语言实现它

问题是——假设我有一些功能
driveInAir()
driveOnRoad()
driveOnWater()
,等等

现在我的类只包含这些特性的子集或全部。例如,一辆飞车可能在公路上行驶,在空中行驶,而一艘船可能在水上行驶。然而,这些功能的定义在不同的类中是通用的,因此我不想重新定义它们

此外,船舶不应能够访问driveOnRoad功能。我正在用Typescript开发它,但是选择的设计模式也应该可以用其他语言扩展,比如python、Java等


其中一个理想的候选者是mixin,它是多重继承的另一种形式,我定义了一个类,其中只包含一个定义功能的函数。而class Ship或FlyingCar扩展了它所需要的类。但是混合/多重继承在不同的语言中不受支持,所以我不太喜欢它。还有其他建议吗?

我的想法是这样的:

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'.
    }
}
尽管你需要一些中产阶级来处理所有的案件


您可以尝试一下(运行时检查控制台的输出)。

就设计而言,这看起来是一个不错的选择。mixin基本上在typescipt或任何其他语言中都做同样的事情(只是混合了不同类的功能)。定义类,实现功能,派生类用父类中定义的方法重写它们的方法。但这看起来更一般。比你好多了@没问题,如果这对你有帮助,请投票并标记为答案!