Ich möchte über die beste Methode (in C#) zu instanziieren ein Objekt basierend auf einer Eingabezeichenfolge diskutieren. Lassen Sie mich erklären. Let'say Ich habe eine Basisklasse:Der beste Ansatz, um Objekt basierend auf String zu instanziieren
public abstract class BaseCar
{
public asbtract int GetEngineID();
//Other stuff...
}
Dann habe ich mehrere Implementierungen dieser Klasse, sagen wir mal:
public class SportCar : BaseCar
{
public override int GetEngine()
{
//Specific implementation
}
}
public class OtherCar: BaseCar
{
public override int GetEngine()
{
//Specific implementation
}
}
Und so weiter ...
Was würde ich zu tun ist, eine statische CarFactory-Klasse zu machen, die eine CreateCar
-Methode hat, die einen string
als einen Parameter annimmt und eine BaseCar
-Instanz zurückgibt, abhängig davon, welche Zeichenfolge Sie geben. Die Zeichenfolge wäre ein Name einer untergeordneten Klasse.
Zum Beispiel, wenn ich CarFactory.CreateCar('SportCar')
aufrufen, sollte es eine SportCar-Instanz zurückgeben.
Ich weiß, dass ich eine einfache switch-Anweisung verwenden könnte zu prüfen, welche Auto angefordert wurde, und erstellen Sie eine neue Instanz auf dem basiert, aber ich mag diesen Ansatz aus zwei Gründen nicht:
- Ich plane haben eine Menge von Kind Klassen, hard-coding alle
case
wäre nicht zu einfach zu pflegen - Ich plane, eine Inizialisierungsprozedur zu implementieren, um auch einige anfängliche Werte zu den Objekten, die ich erstelle (mit Reflection), so hart-Codierung zu mischen und Reflexion scheint mir keine gute Idee zu sein.
Was ich dachte, ist die Assembly.CreateInstance
von System.Reflection zu verwenden, um eine Instanz der angegebenen Klasse zu erstellen, aber da dies das erste Mal, dass ich dieses Problem nähern, ich weiß nicht, ob es bessere Möglichkeiten gibt das zu tun. Ist das ein gültiger Ansatz?
Wenn man bedenkt, dass die Eingabezeichenfolge von einer XML-Datei kommt, gibt es eine einfachere Methode? Vielleicht wird mein Problem bereits in einigen .NET Assemblies behandelt, die ich vermisse.
https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx –
Gleiche Abfrage hier (für Java) ..sollte wahrscheinlich einige Hinweise geben: http://stackoverflow.com/questions/3434466/creating-a-factory-method-in-java-that-doesnt-rely-on-i-el-se – Achilles