Ich habe einige Probleme, herauszufinden, wie man ein Problem löst, ohne statische Methode in einer abstrakten Klasse oder Schnittstelle zu haben. Betrachten Sie den folgenden Code. Ich habe viele Wizards, die von AbsWizard erben. Jeder Zauberer hat eine Methode GetMagic (string spell), die nur Magie für bestimmte magische Wörter zurückgibt, aber alle Instanzen eines bestimmten Zauberertyps reagieren auf denselben Satz magischer Wörter.Was ist eine Alternative zu statischen abstrakten Methoden?
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;
}
}
Ich möchte, dass die Benutzer in der Lage sein, zunächst die Art des Assistenten zu wählen und dann mit einer Liste der Zauber präsentiert diese Art von Assistenten werfen können. Wenn sie dann einen Zauberspruch auswählen, findet das Programm alle vorhandenen Zauberer des ausgewählten Typs und lässt sie den ausgewählten Zauber wirken. Alle Wizards eines bestimmten Typs haben immer die gleichen verfügbaren Spells, und ich brauche eine Möglichkeit, um die Spells zu bestimmen, die ein bestimmter Wizard-Typ ohne Zugriff auf eine Instanz des ausgewählten Wizard-Typs ausgeben kann.
Zusätzlich möchte ich nicht auf eine separate Liste von möglichen Assistentenarten oder Sprüchen angewiesen sein. Stattdessen würde ich lieber alles durch GetAvalibleSpells() und Reflektion ableiten. Zum Beispiel plane ich, Magie wie folgt zu werfen:
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);
}
seine 'Available', nicht' Avalible': P –
@ Andreas Grech - Warum nicht reparieren? –
@Andreas es ist "es ist", nicht "es": P –