我在尝试解决一个问题时遇到了困难:在抽象类或接口中不能使用静态方法。请看下面的代码。我有许多继承自AbsWizard的巫师,每个巫师都有一个GetMagic(string spell)方法,该方法仅返回某些魔法单词的魔法,但同一类型的所有巫师实例都响应相同的魔法单词。
public abstract class AbsWizard
{
public abstract Magic GetMagic(String magicword);
public abstract string[] GetAvalibleSpells();
}
public class WhiteWizard : AbsWizard
{
public override Magic GetMagic(string magicword)
{
//returns some magic based on the magic word
}
public override string[] GetAvalibleSpells()
{
string[] spells = {"booblah","zoombar"};
return spells;
}
}
public class BlackWizard : AbsWizard
{
public override Magic GetMagic(string magicword)
{
//returns some magic based on the magic word
}
public override string[] GetAvalibleSpells()
{
string[] spells = { "zoogle", "xclondon" };
return spells;
}
}
我希望用户首先能够选择巫师的类型,然后呈现该类型巫师可以施展的咒语列表。当他们选择一个咒语时,程序将查找所有已存在的选择类型的巫师,并让他们施展所选的咒语。特定类型的所有巫师始终具有相同的可用咒语,我需要一种方法来确定特定类型的巫师可以施展哪些咒语,而不需要实际访问所选类型的巫师的实例。
此外,我不想依赖于可能的巫师类型或咒语的单独列表。相反,我宁愿通过GetAvalibleSpells()和反射来推断一切。例如,我计划按以下方式施展魔法:
public static void CastMagic()
{
Type[] types = System.Reflection.Assembly.GetExecutingAssembly().GetTypes();
List<Type> wizardTypes = new List<Type>();
List<string> avalibleSpells = new List<string>();
Type selectedWizardType;
string selectedSpell;
foreach (Type t in types)
{
if (typeof(AbsWizard).IsAssignableFrom(t))
{
wizardTypes.Add(t);
}
}
//Allow user to pick a wizard type (assign a value to selectedWizardType)
//find the spells the selected type of wizard can cast (populate availibleSpells)
//Alow user to pick the spell (assign a value to selectedSpell)
//Find all instances, if any exsist, of wizards of type selectedWizardType and call GetMagic(selectedSpell);
}
System.Reflection.Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(AbsWizard).IsAssignableFrom(t))
。 - Calvin Fisher