在AngularJS Typescript中从父类创建子实例

前端之家收集整理的这篇文章主要介绍了在AngularJS Typescript中从父类创建子实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何从父方法为子类创建实例?

例如:

  1. class Vehicle {
  2. public getNewInstance(): ICar {
  3. // What should be here?
  4. return new XXXXXXXX;
  5. }
  6. }
  7.  
  8. class Car extends Vehicle {
  9. public getWheels(): Number {
  10. return 4;
  11. }
  12. }

现在,我需要这样做以获得一个新的Car实例:

  1. Car.getNewInstance();

车辆有许多扩展类,我防止在每个孩子中重复代码.此外,儿童班也有更多的孩子.

解决方法

您的代码不会这样做,因为您需要静态方法而不是实例方法.

你可以这样做:

  1. class Vehicle {
  2. public static getNewInstance(): Vehicle {
  3. return new this();
  4. }
  5.  
  6. public getWheels(): Number {
  7. throw new Error("unknown number of wheels for abstract Vehicle");
  8. }
  9. }
  10.  
  11. class Car extends Vehicle {
  12. public getWheels(): Number {
  13. return 4;
  14. }
  15. }

因为Vehicle现在有一个静态getNewInstance方法,所以所有扩展类也都有.
所以:

  1. let v = Vehicle.getNewInstance();
  2. console.log(v); // Vehicle {}
  3. console.log(v.getWheels()); // Uncaught Error: unknown number of wheels for abstract Vehicle
  4.  
  5. let c = Car.getNewInstance();
  6. console.log(c); // Car {}
  7. console.log(c.getWheels()); // 4

编辑

如果我误解了你并且你确实想在现有实例上调用getNewInstance,那么你可以这样做:

  1. abstract class Vehicle {
  2. public abstract getNewInstance(): Vehicle;
  3. }
  4.  
  5. class Car extends Vehicle {
  6. public getNewInstance(): Vehicle {
  7. return new Car();
  8. }
  9.  
  10. public getWheels(): Number {
  11. return 4;
  12. }
  13. }

或这个:

  1. class Vehicle {
  2. private ctor: { new (): Vehicle };
  3.  
  4. constructor(ctor: { new (): Vehicle }) {
  5. this.ctor = ctor;
  6. }
  7.  
  8. public getNewInstance(): Vehicle {
  9. return new this.ctor();
  10. }
  11. }
  12.  
  13. class Car extends Vehicle {
  14. constructor() {
  15. super(Car);
  16. }
  17.  
  18. public getWheels(): Number {
  19. return 4;
  20. }
  21. }

猜你在找的Angularjs相关文章