我在想出一个声音设计时遇到了一些麻烦,因为对我来说这是一个相当棘手的模块。实际的业务逻辑把我弄得一团糟,所以我把它改写成更容易理解的形式。我正在用 C# 编码,尽管我猜实际设计与语言无关。
想象一下,您正在编写一个简单的奇幻角色扮演游戏。你有一个球员,他有一些基本的属性。玩家可以装备一些物品,这可能会以某种方式影响他的属性。项目具有一个或多个属性,这些属性定义了哪些属性被修改。
public Character
{
public string charName;
public int charStrength;
public int charHitPoints;
...
public List<Item> equippedItems;
}
public Item
{
public string itemName;
public List<ItemProperty> itemProperties;
}
public ItemProperty
{
public int propertyValue;
public virtual void applyPropertyModification(Character charStatsToBeModified){}
}
字符数据采用 XML 格式:
<Character>
<Name>John Doe</Name>
<BaseStrength>10</BaseStrength>
<BaseHitPoints>100</BaseHitPoints>
<Items>
<Item>
<Name>Short Sword</Name>
<Properties>
<Strength>10</Strength>
<HitPoints>200</HitPoints>
</Properties>
</Item>
</Items>
<Character>
我正在寻找一种从 XML 加载字符数据的方法,它允许我轻松添加 X 通用新字符属性(想象 50 左右)和/或 Y 通用项目属性(想象 100-150 左右)。
我的设计思路:
每个可能的字符属性都作为新属性添加到 Character 类中。随着属性数量的增加,可能会变得笨拙。每个可能的 Item Property 都作为其自己的 ItemProperty 子类添加,并带有适当的applyPropertyModification
方法。
public Strength : ItemProperty
{
public override void applyPropertyModification(Character charStatsToBeModified)
{
charStatsToBeModified.charStrength += this.propertyValue
}
}
这看起来确实是大量的过多代码,特别是因为所有被覆盖的方法正在确定应该修改哪个字符属性。
ItemProperty 将使用反射创建,元素 XML 标记对应于适当的 ItemProperty 子类(我认为替代方案是 100 条件开关?)。
我的总体设计是合理的,还是我接近这个方向是错误的?我没有足够的知识来自己解决这个问题,但我相信有一种更简洁的方法可以做到这一点。此外,如果这个问题根本不清楚或漫无边际,请告诉我,我会尝试澄清/改述。谢谢。