例如,我有一個現有的抽象類,Vehicle我想創建一個中間類來減少可實體化類中抽象屬性的重復。
問題:
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.
uj5u.com熱心網友回復:
可以使用 getter 和 setter 實作屬性,然后在建構式中分配它們的值。
所以代碼會是這樣的:
abstract class Vehicle {
abstract wheelCount: number
abstract tireCount: number
}
和類具有屬性和相應的 getter 和 setter:
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 Teasl extends StandardVehicle {
constructor(value: number) {
super(value)
}
}
你可以這樣稱呼你的班級:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465535.html
