Typescript多类继承设计

问题描述 投票:2回答:1

我正在为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 multiple-inheritance
1个回答
0
投票

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();
    }
}

但是我不确定你为什么会想要这个。

思考问题的继承方向是一个常见的错误,正确的解决方案是将对象和类组合在一起而不是继承行为。

© www.soinside.com 2019 - 2024. All rights reserved.