如何从父方法为子类创建实例?
例如:
class Vehicle { public getNewInstance(): ICar { // What should be here? return new XXXXXXXX; } } class Car extends Vehicle { public getWheels(): Number { return 4; } }
现在,我需要这样做以获得一个新的Car实例:
Car.getNewInstance();
车辆有许多扩展类,我防止在每个孩子中重复代码.此外,儿童班也有更多的孩子.
解决方法
您的代码不会这样做,因为您需要静态方法而不是实例方法.
你可以这样做:
class Vehicle { public static getNewInstance(): Vehicle { return new this(); } public getWheels(): Number { throw new Error("unknown number of wheels for abstract Vehicle"); } } class Car extends Vehicle { public getWheels(): Number { return 4; } }
因为Vehicle现在有一个静态getNewInstance方法,所以所有扩展类也都有.
所以:
let v = Vehicle.getNewInstance(); console.log(v); // Vehicle {} console.log(v.getWheels()); // Uncaught Error: unknown number of wheels for abstract Vehicle let c = Car.getNewInstance(); console.log(c); // Car {} console.log(c.getWheels()); // 4
编辑
如果我误解了你并且你确实想在现有实例上调用getNewInstance,那么你可以这样做:
abstract class Vehicle { public abstract getNewInstance(): Vehicle; } class Car extends Vehicle { public getNewInstance(): Vehicle { return new Car(); } public getWheels(): Number { return 4; } }
或这个:
class Vehicle { private ctor: { new (): Vehicle }; constructor(ctor: { new (): Vehicle }) { this.ctor = ctor; } public getNewInstance(): Vehicle { return new this.ctor(); } } class Car extends Vehicle { constructor() { super(Car); } public getWheels(): Number { return 4; } }