Typescript 多重 class 继承设计
Typescript multiple class inheritance design
我正在用 Typescript 为一家餐厅设计一个菜单系统。我已经定义了一个接口来为每个菜单项实现必要的功能:
interface HasPrice {
getPrice(): number;
}
每个菜单项由 class.
定义
class Gobi implements HasPrice {
getPrice() : number {
return 50;
}
}
class FriedRice implements HasPrice {
getPrice() : number {
return 100;
}
}
我正在使用装饰器 class 来添加浇头。 eg.Fried鸡饭
class FriedRiceWithChicken implements HasPrice {
getPrice() : number {
return super.getPrice() + 25;
}
}
现在我想为组合菜单扩展这个系统。例如。炒饭+戈壁
class FriedRiceAndGobi extends FriedRice, Gobi {
getPrice() : number {
return FriedRice.getPrice() + Gobi.getPrice();
}
}
如何实施组合 classes?有没有一种方法可以编写通用的 class/method 来实现组合菜单?
Typescript 不支持多重继承。
您想要多重继承有几个不同的原因。然而,你的例子不是其中之一。
如果使用您的示例,我需要一个封装两种成分的 class,这就是我的处理方式:
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,可以采用任意输入组合。如果你想要一些非常具体的东西,你可以这样做:
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();
}
}
但我不确定你为什么会想要这个。
在问题的继承方向上思考是一个常见的错误,正确的解决方案是将对象和 class 组合在一起而不是继承行为。
我正在用 Typescript 为一家餐厅设计一个菜单系统。我已经定义了一个接口来为每个菜单项实现必要的功能:
interface HasPrice {
getPrice(): number;
}
每个菜单项由 class.
定义class Gobi implements HasPrice {
getPrice() : number {
return 50;
}
}
class FriedRice implements HasPrice {
getPrice() : number {
return 100;
}
}
我正在使用装饰器 class 来添加浇头。 eg.Fried鸡饭
class FriedRiceWithChicken implements HasPrice {
getPrice() : number {
return super.getPrice() + 25;
}
}
现在我想为组合菜单扩展这个系统。例如。炒饭+戈壁
class FriedRiceAndGobi extends FriedRice, Gobi {
getPrice() : number {
return FriedRice.getPrice() + Gobi.getPrice();
}
}
如何实施组合 classes?有没有一种方法可以编写通用的 class/method 来实现组合菜单?
Typescript 不支持多重继承。
您想要多重继承有几个不同的原因。然而,你的例子不是其中之一。
如果使用您的示例,我需要一个封装两种成分的 class,这就是我的处理方式:
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,可以采用任意输入组合。如果你想要一些非常具体的东西,你可以这样做:
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();
}
}
但我不确定你为什么会想要这个。
在问题的继承方向上思考是一个常见的错误,正确的解决方案是将对象和 class 组合在一起而不是继承行为。