【问题标题】:C# OOP - One class can be two different things (Inheritance Issue)C# OOP - 一个类可以是两种不同的东西(继承问题)
【发布时间】:2014-05-20 15:18:45
【问题描述】:

我正在用 C# 制作控制台游戏,但遇到了 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(这里的继承被有意删除),但这会产生一个大问题。

虽然您可以在商店购买一些武器,但您只能通过完成任务来获得其他武器。

因此,武器有时是 ShopItem(因为它可以在商店中购买),有时它只是物品(不能在商店中购买)。

如果物品是 ShopItem,有时可以在商店中购买(因为 ShopItem 继承自 Item)。

那么我可以在这里做什么?我显然不能从两者继承,如果我从 Item 类继承,我就不能在商店中出售 Weapon 对象(因为我无法将它转换成 ShopItem)。

您认为这种情况的最佳解决方案是什么?

【问题讨论】:

标签: c# .net oop inheritance paradigms


【解决方案1】:

在设计类层次结构时,您应该考虑行为(方法)而不是属性,即您可以对项目做什么

在您的示例中,我认为ShopItem 不应该继承自Item,而是您应该定义一个接口IBuyable,它表示可以购买Item

【讨论】:

  • 或者一个 IItem 接口,这将是我的建议。但这仍然是 IMO 的正确方法。
  • 我已经想到了这一点,但想想如果我将 ShopItem 的字段放入 Item 会发生什么。问题是从 Item 继承的所有类都将看到所有 ShopItem 的字段,即使它们本身不是 ShopItem(例如 Rare Sword 从 Item 继承,但它不是 ShopItem,但它将具有 ShopItem 的字段,因为它们'重新成为项目的一部分)。是不是和你的建议差不多?
  • 另外,如果武器继承自 IBuyable,这意味着所有武器都是可购买的。这正是我现在的问题,IBuyable 界面不会改变它(因为如果 Weapon : IBuyable,这意味着所有武器仍然是可购买的)。
  • 我觉得你想多了,所有的武器都可以买到,不一定要在商店里。只有你的店铺在店里才会公开价格。
  • @Travier 或另一种看待它的方式是,如果将武器作为奖励给予,用户无需知道如果用户在商店购买武器的价格是多少。
【解决方案2】:

你可以定义一个接口:

interface IWeapon{}

并以这种方式更改您的层次结构:

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

【讨论】:

  • 非常感谢。我决定在 Weapon 类上只使用一个布尔字段,所以无论如何,它总是有 ShopItem 字段(布尔字段指示武器是否在商店中可用)。但是,这仍然是我想要的最接近的想法,实际上是解决这个问题的好方法。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多