无法覆盖装饰器模式方法

时间:2018-03-28 07:33:56

标签: javascript design-patterns ecmascript-6

我正在学习装饰模式,而我无法围绕方法覆盖。

我有一个Phone.ts班,其中phoneDescriptioncost有吸气剂。 成本获取者应该被延伸到它的手机品牌类的成本所覆盖。

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)

1 个答案:

答案 0 :(得分:1)

cost是装扮者的方法,而不是电话。因此,您需要实施price get Pixel(不是cost):

export default class Pixel extends Phone {
  get price(): number {
    return 800;
  }
}