mik*_*dev 2 c# design-patterns decorator
我正在编写一个游戏作为练习,我遇到了一个设计问题.我的角色扮演游戏将有典型的类,如战士,向导,Theif,牧师.如何设计课程以便玩家可以多班?例如,一个玩家可能从战斗机开始(并获得相关技能的战士),然后多级到一个巫师(此时他们获得向导法术),后来再多个级别又一个流氓(现在获得所有能力的流氓有).所以这个玩家现在是战斗机向导 - 盗贼.我不知道在C#中表示这个.
起初我尝试使用装饰器模式,但我不能多次多次使用它.关于如何设计这个的任何指针?
我唯一能想到的就是IList<CharacterBaseClass>为每个角色拥有一个属性,并将Fighter,Wizard,Rogue等添加到玩家多类中.所以像这样......
class CharacterBaseClass
{
public IList<CharacterBaseClass> MultiClasses { get; set; }
// constructors, etc
}
Run Code Online (Sandbox Code Playgroud)
每次我们将它们添加到IList中
// player starts off as Fighter
Warrior player1 = new Warrior();
// now multi-class to Wizard
player1.MultiClasses.Add(new Wizard());
// now multi-class to Theif
player1.MultiClasses.Add(new Theif());
Run Code Online (Sandbox Code Playgroud)
我敢肯定必须有比这更好的方法吗?
仅仅因为你的角色是巫师和战士,这并不意味着你必须为他们创建子类.相反,问问自己,"在代码级别,角色的课程做什么?" 可能,你根本不想要为字符类设置C#子类.相反,弄清楚类实际做了什么,然后确定在代码中对其进行建模的正确方法.
例如,如果字符类限制了角色可以使用的设备,那么您可以为AllowedEquipment以下内容定义一个类:
public class AllowedEquipment
{
public static AllowedEquiment Warrior()
{
return new AllowedEquipment() {
Daggers = true;
Swords = true;
Shields = true;
Armor = true
};
}
public static AllowedEquiment Wizard()
{
return new AllowedEquipment() {
Daggers = true;
Swords = false;
Shields = false;
Armor = true
};
}
public bool Daggers { get; set; }
public bool Swords { get; set; }
public bool Shields { get; set; }
public bool Armor { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
不要觉得你需要使用子类来模拟游戏中的每个"is-a"关系.
另一种选择是使用Type Object模式为您的角色类建模.如果你这样做,那么很容易为每个角色提供一组Type Object实例而不是一个实例,这实际上为你提供了多重继承.