Тип наследования нескольких классов Typescript - PullRequest
2 голосов
/ 09 октября 2019

Я разрабатываю систему меню для ресторана в Typescript. Я определил интерфейс для реализации необходимой функции для каждого пункта меню:

interface HasPrice {
    getPrice(): number;
}

Каждый пункт меню определяется классом.

class Gobi implements HasPrice {
    getPrice() : number {
        return 50;
    }
}

class FriedRice implements HasPrice {
    getPrice() : number {
        return 100;
    }
}

Я использую класс декоратора для добавления начинки. Например, жареный рис с курицей

class FriedRiceWithChicken implements HasPrice {
    getPrice() : number {
        return super.getPrice() + 25;
    }
}

Теперь я хочу расширить эту систему для комбинированных меню. например. Fried Rice + Gobi

class FriedRiceAndGobi extends FriedRice, Gobi {
    getPrice() : number {
        return FriedRice.getPrice() + Gobi.getPrice();
    }
}

Как мне реализовать комбо-классы? Есть ли способ, которым я могу написать общий класс / метод для реализации комбинированного меню?

1 Ответ

1 голос
/ 10 октября 2019

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

Но я не уверен, почему вы когда-нибудь этого захотите.

Думать в направлении наследования для вашей проблемы - этоРаспространенная ошибка, и правильное решение состоит в том, чтобы объединять объекты и классы вместе, а не наследовать поведение.

...