Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#OOP-一个类可以是两个不同的东西(继承问题)_C#_.net_Oop_Inheritance_Paradigms - Fatal编程技术网

C#OOP-一个类可以是两个不同的东西(继承问题)

C#OOP-一个类可以是两个不同的东西(继承问题),c#,.net,oop,inheritance,paradigms,C#,.net,Oop,Inheritance,Paradigms,我正在用C#制作一个控制台游戏,遇到了OOP范例的问题 我有一个项目类: class Item { public int SellPrice; public string Name; } 以及ShopItem类,它表示可以在商店中购买的物品对象: class ShopItem : Item { public int Price; } 最后是武器类: class Weapon { publi

我正在用C#制作一个控制台游戏,遇到了OOP范例的问题

我有一个项目类:

class Item
    {
        public int SellPrice;
        public string Name;
    }
以及ShopItem类,它表示可以在商店中购买的物品对象:

class ShopItem : Item
    {
        public int Price;
    }
最后是武器类:

class Weapon
    {
        public int Attack, Durability;
    }
现在,每个武器对象都是一个项目(这里的继承是故意删除的),但这会造成一个大问题

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

所以,武器有时是商店里的物品(因为它可以在商店里买到),有时只是一件物品(不能在商店里买到)

不过,如果商品是ShopItem,则有时可以在商店中购买(因为ShopItem继承自该商品)

我能在这里做什么?很明显,我不能同时从这两个类继承,如果我从Item类继承,那么我就不能在商店里出售武器对象(因为我无法将其转换为ShopItem)


您认为什么是解决此类问题的最佳解决方案?

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


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

在设计类层次结构时,您应该考虑行为(方法)而不是属性,也就是说,你可以对一件物品做什么


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

您可以定义一个接口:

interface IWeapon{}
并通过以下方式更改您的层次结构:

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

您可以定义一个接口:

interface IWeapon{}
并通过以下方式更改您的层次结构:

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

或者是一个项目接口,这将是我的建议。但在我看来,这仍然是正确的方法。我已经想到了这一点,但想想如果我将ShopItem的字段放入Item中会发生什么。问题是,从Item继承的所有类都会看到所有ShopItem的字段,即使它们本身不是ShopItems(对于exmaple来说,一把罕见的剑继承自Item,但它不是ShopItem,但它会有ShopItem的字段,因为它们是Item的一部分)。这和你的建议不一样吗?而且,如果武器是从IBuyable继承的,那就意味着所有武器都是可以购买的。这正是我现在的问题,接口IBuyable不会改变它(因为如果武器:IBuyable,这意味着所有的武器仍然可以购买)。我想你想得太多了,所有的武器都可以购买,不一定要在商店里。只有你的商店在商店里才会公布价格。@Travier或另一种看待它的方式是,如果武器是作为奖励而提供的,那么用户不需要知道如果用户在商店里购买它的价格。或者,我建议使用一个IItem界面。但在我看来,这仍然是正确的方法。我已经想到了这一点,但想想如果我将ShopItem的字段放入Item中会发生什么。问题是,从Item继承的所有类都会看到所有ShopItem的字段,即使它们本身不是ShopItems(对于exmaple来说,一把罕见的剑继承自Item,但它不是ShopItem,但它会有ShopItem的字段,因为它们是Item的一部分)。这和你的建议不一样吗?而且,如果武器是从IBuyable继承的,那就意味着所有武器都是可以购买的。这正是我现在的问题,接口IBuyable不会改变它(因为如果武器:IBuyable,这意味着所有的武器仍然可以购买)。我想你想得太多了,所有的武器都可以购买,不一定要在商店里。只有你的商店才会在商店里公布价格。@Travier或另一种看待价格的方式是,如果武器是作为奖励提供的,那么用户不需要知道如果用户在商店里购买,价格会是多少。需要了解的事情:界面-特别是,例如,这个问题:-将宠物与动物视为你的商店物品与动物项目。另外,可能是组合而不是继承,尽管我觉得它不适用于这种情况。需要研究的事情:界面-特别是,例如,这个问题:-将宠物与动物视为你的购物项目与物品。还有,可能是合成而不是继承,尽管我觉得它不适用于这个案例。非常感谢。我决定只在武器类上使用一个布尔字段,所以不管怎样,它总是有ShopItem字段(布尔字段指示武器是否在商店中可用)。但是,这仍然是最接近我想要的想法,实际上是解决这个问题的一个好方法。再次感谢!非常感谢你。我决定只在武器类上使用一个布尔字段,所以不管怎样,它总是有ShopItem字段(布尔字段指示武器是否在商店中可用)。但是,这仍然是最接近我想要的想法,实际上是解决这个问题的一个好方法。再次感谢!