С# OOP - один класс может быть двумя разными способами (проблема наследования)

Я делаю консольную игру на С# и столкнулся с проблемой с парадигмой ООП.

У меня есть класс Item:

class Item
 {
 public int SellPrice;
 public string Name;
 }

И класс ShopItem, который представляет объекты Item, которые можно купить в магазинах:

class ShopItem : Item
 {
 public int Price;
 }

И, наконец, класс оружия:

class Weapon
 {
 public int Attack, Durability;
 }

Теперь каждый объект Weapon является Item (наследование здесь целенаправленно удалено), но это создает серьезную проблему.

Хотя вы можете купить оружие в магазинах, вы можете получить других, выполнив квесты.

Таким образом, Weapon иногда является ShopItem (потому что его можно купить в магазинах), а иногда это просто предмет (который нельзя купить в магазинах).

Элементы иногда можно купить в магазинах, если они ShopItem, хотя (поскольку ShopItem наследуется от Item).

Так что я могу здесь сделать? Я, очевидно, не могу наследовать от обоих, и если я наследую класс Item, то я не могу продать объект Weapon в магазинах (потому что я не смог бы передать его в ShopItem).

Как вы считаете, лучшее решение для такого?

2 ответа

Вы можете определить интерфейс:

interface IWeapon{}

И измените свою иерархию таким образом:

class ShopWeapon : IWeapon, ShopItem {}
class Weapon : IWeapon, Item {}


Вы должны думать с точки зрения поведения (методов) вместо свойств при разработке иерархии классов, то есть что вы можете делать с элементом?

В вашем примере я не думаю, что ShopItem должен наследовать от Item, но вы должны определить интерфейс IBuyable который указывает, что Item можно купить.

licensed under cc by-sa 3.0 with attribution.