Zur Verdeutlichung: Anstatt enums zu verwenden, wo enum angibt, welche Methode verwendet werden soll, verwende ich Klassen, die von der gleichen Basisklasse abgeleitet sind. Anstatt also eine Methode auszuwählen, die enum verwendet, wählt der Benutzer eine Klasse aus, die er verwenden möchte (über die Dropdown-Schnittstelle), und die Klasse enthält eine Überschreibung der Methode, die aufgerufen wird. Nachdem ich es wie unten gezeigt funktionierte, versuchte ich online zu schauen, ob ich es richtig mache. Es ist eine Methode, die viele Probleme löst, aber mein Problem ist, dass ich keine Terminologie kenne, um es zu beschreiben und zu prüfen, ob es in der Zukunft ernsthafte Probleme verursachen kann.Die beste Methode zum Implementieren des Klassenselektors
Bevor ich Enums verwenden würde, um ein Werkzeug zu wählen, das ich verwenden möchte (enum tool {Pinsel, Radiergummi, ziehen}). Aber um alles effizienter zu machen, anstatt Enum zu verwenden, erstelle ich jetzt eine Klasse für jedes Werkzeug, das von der Basisklasse "ToolType" abgeleitet ist. Dann verwende ich Reflektion, um alle Klassen zu finden, die von ToolType erben, und sie in einem statischen Array zu platzieren. Und jetzt benutze ich diese Methode für die meisten Dinge in meinem Projekt, es ist einfach Dinge hinzuzufügen/zu entfernen, es ist nicht nötig jedes Enum-Array zu bearbeiten, wenn du eine neue Klasse hinzufügst. Es fühlt sich an wie eine beste Lösung für ein modulares Projekt, aber ich habe noch keine Beispiele dafür gefunden, also bin ich mir nicht sicher, ob ich es richtig mache. Nach was soll ich suchen?
static Family() {
List<Type> allTypes = CsharpFuncs.GetAllChildTypesOf<T>();
family = new T[allTypes.Count];
names = new string[allTypes.Count];
Debug.Log("Creating "+typeof(T).ToString());
for (int i = 0; i < allTypes.Count; i++) {
Debug.Log("Adding " + allTypes[i].ToString());
T tmp = (T)Activator.CreateInstance(allTypes[i]);
family[i] = tmp;
tmp.index = i;
names[i] = tmp.ToString();
}
}
Dies ist der Konstruktor von
public class Family<T> where T : Family<T>
Dann kann ich
public class newToolBase : Family<newToolBase> {
}
public class Radiergummi haben: newToolBase {
}
public class Bleistift: newToolBase {
}
Ich bin mit Unity und was ich mit "Auswahl" bedeuten, ist in der Regel Option manuell etwas aus einem Drop-Down wählen. Wie Sie sehen, hat die Basisklasse ein Array von Namen und diese werden angezeigt, wenn der Benutzer etwas auswählt. Jedes spawnbare Objekt, jede KI-Methode verwendet diese Klasse. Ich füge nur ein Skript hinzu, das von der Basisklasse abgeleitet ist, die wiederum von der Familienklasse abgeleitet ist und sie kann ausgewählt oder zu einer Liste hinzugefügt werden.
Von den Kommentaren unten erfuhr ich über Abhängigkeiten Injection und liest gerade darüber. Ich habe dies in der Hoffnung geschrieben, dass die Leute sofort erkennen, was ich versuche, und auf so etwas hinweisen.
Um zu verdeutlichen, gibt es kein offensichtliches Problem mit meinem Ansatz, aber bevor ich Stunden damit verbringe, viele Enums zu ersetzen, möchte ich sicherstellen. Vielen Dank.
Verwenden Sie eine Dependency Injection? z.B. 'Unity',' MEF', 'Ninject' – Nova
Kontraindikation: Was ist, wenn Sie eine zweite Reihe von ToolTypes benötigen? Eines, das du nicht auswählbar sein willst, wo das erste Set ist ... – Fildor
Es klingt, als ob du nach einem [Muster] (http://www.dofactory.com/net/design-patterns) fragst Sie haben nicht gezeigt, was das Problem ist. Wähler? Womit? Nach Schlüssel - Wörterbuch, nach Index - Sammlung ... Auch was ist das Kriterium dafür, warum die aktuelle Methode schlecht ist? Nur Zweifel? Sag jedem, dass er in die Hölle gehen soll, du bist der Programmierer, es ist deine Aufgabe ... – Sinatr