如何自动填充摘要 属性?

How to auto-populate an abstract property?

我有一个现有的抽象 class,比如 Vehicle,我想创建一个中间体 class 以减少我的实例化 class 中抽象属性的重复。

问题:

abstract class Vehicle {
  abstract wheelCount: number
  abstract tireCount: number
}

class Car extends Vehicle {
  wheelCount = 4
  tireCount = 4 // Tire count is the same as wheel count
}

class Truck extends Vehicle {
  wheelCount = 4
  tireCount = 4 // Tire count is the same here too
}

class Bike extends Vehicle {
  wheelCount = 2
  tireCount = 2 // Tire count is the same - I really need to abstract this
}

一个无效的解决方案:

abstract class Vehicle {
  abstract wheelCount: number
  abstract tireCount: number
}

// I want an intermediate class like this
abstract class StandardVehicle extends Vehicle {
  tireCount = wheelCount
}

class Car extends StandardVehicle {
  wheelCount = 4
}

class Truck extends StandardVehicle {
  wheelCount = 4
}

class Bike extends StandardVehicle {
  wheelCount = 2
}

请问有哪些有效的解决方案?

请注意,在某些情况下 wheelCounttireCount 会有所不同,因此我无法在 Vehicle 中组合这些属性。

可以使用 getter 和 setter 实现属性,然后在构造函数中分配它们的值。

所以代码是这样的:

abstract class Vehicle {
  abstract wheelCount: number
  abstract tireCount: number
}

和 class 具有属性和相应的 getters 和 setters:

abstract class StandardVehicle extends Vehicle {
    private _wheelCount!: number;
    get wheelCount(): number {
        return this._wheelCount;
    }
    set wheelCount(value: number) {
        this._wheelCount = value;
    }


    private _tireCount!: number;
    get tireCount(): number {
        return this._tireCount;
    }
    set tireCount(value: number) {
        this._tireCount = value;
    }

    constructor(wheelCount: number) {
        super()
        this._wheelCount = this._tireCount = wheelCount
    }
}

并且可以在具体 class:

中分配一些公共值
class Teasl extends StandardVehicle {
    constructor(value: number) {
        super(value)
    }
}

您可以这样称呼您的 class:

const anExampleVariable = new Teasl(88)

作为替代方案, 可以创建初始化函数来填充值。

所以代码看起来像这样。抽象:

abstract class Vehicle {
  abstract wheelCount: number
  abstract tireCount: number
}

abstract class StandardVehicle extends Vehicle {
  constructor(value:number) {
      super()
      this.init(value)
  }

    private init(value:number) {
        this.wheelCount = this.tireCount = value
    }
}

及具体实现:

class Foo extends StandardVehicle {
    wheelCount!: number
    tireCount!: number

    constructor(value: number) {
        super(value)
    }
}

和用法:

const anExampleVariable = new Foo(88)
console.log(anExampleVariable)