如何自动填充摘要 属性?
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
}
请问有哪些有效的解决方案?
请注意,在某些情况下 wheelCount
和 tireCount
会有所不同,因此我无法在 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)
我有一个现有的抽象 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
}
请问有哪些有效的解决方案?
请注意,在某些情况下 wheelCount
和 tireCount
会有所不同,因此我无法在 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)