我正在学习装饰模式,而我无法围绕方法覆盖。
我有一个Phone.ts
班,其中phoneDescription
和cost
有吸气剂。
成本获取者应该被延伸到它的手机品牌类的成本所覆盖。
Phone.ts
export default class Phone {
private description: string;
constructor(description = 'Default description') {
this.description = description;
}
get phoneDescription() {
return this.description;
}
get price(): number | void {
throw new Error('This method must be overwritten!');
}
}
我有一个特定于模特的课程。在这个例子中,Pixel。
Pixel.ts
import Phone from './Phone';
export default class Pixel extends Phone {
get cost(): number {
return 800;
}
}
到目前为止一切顺利。我能够实例化Pixel
类。
而且我能够从对象中获得成本。
PhoneDecorator.ts
import Phone from './Phone';
export default class PhoneDecorator extends Phone {}
但手机屏幕非常脆弱。我们需要一个屏幕保护膜。 所以,
ScreenProtector.ts
import PhoneDecorator from './PhoneDecorator';
export default class ScreenProtector extends PhoneDecorator {
phone: any;
constructor(phone: any) {
super();
this.phone = phone
}
get cost(): number {
return 50 + this.phone.price;
}
}
此屏幕保护程序应将 50 添加到构造函数中提供的手机的当前价格。
但我收到错误This method must be overwritten!
index.ts
import ScreenProtector from './ScreenProtector';
import Pixel from './Pixel';
let pixel = new Pixel();
pixel = new ScreenProtector(pixel);
console.log(pixel.cost)
答案 0 :(得分:1)
cost
是装扮者的方法,而不是电话。因此,您需要实施price
get Pixel
(不是cost
):
export default class Pixel extends Phone {
get price(): number {
return 800;
}
}