C#OOP-一个类可以是两个不同的东西(继承问题)
我正在用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
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字段(布尔字段指示武器是否在商店中可用)。但是,这仍然是最接近我想要的想法,实际上是解决这个问题的一个好方法。再次感谢!