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 组合在一起而不是继承行为。