【发布时间】:2015-06-15 13:44:49
【问题描述】:
我终于开始学习 OOP 原理,目前正在制作一个简单的游戏。 情况如下: 我有一个名为 Items 的抽象类,它将项目的所有可能属性作为属性和项目的质量作为枚举:
public enum ItemQuality
{
Common,
Uncommon,
Rare,
Epic,
Legendary
}
public abstract class Items
{
public ItemQuality ItemQuality { get; set; }
public int Stamina { get; set; }
public int Strength { get; set; }
public int Agility { get; set; }
public int Intelligence { get; set; }
public int Damage { get; set; }
public int Block { get; set; }
public int Armor { get; set; }
}
我还有两个名为 Weapon 和 Armor 的类(它们继承了 Items 类),它们分别拥有 WeaponType 和 ArmorType,它们也是枚举。
考虑以下场景:我制作了一把剑类型的新武器,我可以给它一个格挡值,但它不能格挡。我想根据武器/盔甲类型显示不同的属性。
Weapon weapon = new Weapon();
weapon.WeaponType = WeaponType.Sword;
weapon.Block = 5;
在这种情况下,我应该看不到 Block 属性。
为了更进一步,我不想将武器和盔甲与角色分开实例化(我也有一个角色类)。
我的最终目标是做这样的事情:
Character character = new Character();
character.WeaponType = WeaponType.Sword;
character.WeaponType.Damage = 10;
或者类似的东西,我什至不确定我的结构是否正确,所以我愿意接受建议! 谢谢!
【问题讨论】:
-
考虑使用接口代替继承。
-
也许装饰器模式适合你。所以你可以用一个包含额外需要的属性的装饰器来包装基类
-
谢谢大家!看来我还有很多东西要学:)
-
你在这里所做的违反了 Listov 替换原则 (en.wikipedia.org/wiki/Liskov_substitution_principle)。定义一个包含所有内容的基类,然后有选择地尝试隐藏内容与“最佳实践”完全相反。相反,请遵循@JanneMatikainen 的建议并了解接口和组合,而不是继承。
-
在您给定的场景中,最好在子类中包含 Damage、Block 等属性。这样只有武器有伤害等。