我正在为Typescript餐厅设计菜单系统。我已经定义了一个接口来实现每个菜单项的必要功能:
interface HasPrice {
getPrice(): number;
}
每个菜单项由一个类定义。
class Gobi implements HasPrice {
getPrice() : number {
return 50;
}
}
class FriedRice implements HasPrice {
getPrice() : number {
return 100;
}
}
我正在使用decorator类添加浇头。例如,鸡肉炒饭
class FriedRiceWithChicken implements HasPrice {
getPrice() : number {
return super.getPrice() + 25;
}
}
现在,我想将此系统扩展为组合菜单。例如。炒饭+戈壁
class FriedRiceAndGobi extends FriedRice, Gobi {
getPrice() : number {
return FriedRice.getPrice() + Gobi.getPrice();
}
}
我如何实现组合类?有没有办法我可以编写通用的类/方法来实现组合菜单?
Typescript不支持多重继承。
出于多种原因,您需要多重继承。但是您的示例不是其中之一。
如果使用您的示例,我需要一个封装两种成分的单一类,这就是我的处理方式:
class CombinedItem {
private menuItems: HasPrice[];
constructor(menuItems: hasPrice[]) {
this.menuItems = menuItems;
}
getPrice() {
return this.menuItems.reduce(
(acc, curr) => acc + curr.getPrice(),
0
);
}
}
然后可以这样构造:
const item = new CombinedItem([
new Rice(),
new Chicken()
]);
CombinedItem是可以接受输入的任何组合的类。如果您想要真正特定的内容,可以执行以下操作:
class ChickenAndRice {
private chicken: Chicken;
private rice: Rice;
constructor(chicken: Chicken, rice: Rice) {
this.chicken = chicken;
this.rice = rice;
}
getPrice() {
return this.chicken.getPrice() + this.rice.getPrice();
}
}
但是我不确定你为什么会想要这个。
思考问题的继承方向是一个常见的错误,正确的解决方案是将对象和类组合在一起而不是继承行为。