2016-08-05 31 views
-1

I 2 Klassen haben, die von einer abstrakten Klasse abgeleitet sinddynamisch Instanz einer Klasse erstellen, die von einer abstrakten Klasse abgeleitet ist

abstract class Order 
{ 
    public virtual boolean Export() 
    { 
     ... 
    } 
} 

class TradeOrder : Order 
{ 
     public override bool Export() 
     { 
      //Create a new order 
     } 
} 

class LibraryOrder : Order 
{ 
     public override bool Export() 
     { 
      //Dont create order but Update an existing order 
     } 

} 

TradeOrder für Customer „Handel“ erstellt und LibraryOrder wird für Customer „Bibliothek erstellt ".

Der Kundentyp wird in naher Zukunft wachsen.

Wie erstelle ich eine Instanz der abgeleiteten Klasse basierend auf dem Kundentyp ohne zu verwenden, wenn ... else oder swicth ... case?

Die Instanz der Klasse ruft die Exportmethode auf, um einen Kundenauftrag zu erstellen oder zu aktualisieren.

-Alan-

+0

Wie stellen Sie Kundentypen im Code dar? Haben Sie beispielsweise eine Klasse pro Kundentyp, die alle aus einer Basis-Kundenklasse stammt? –

+0

Hilft das? http://stackoverflow.com/questions/17835839/use-an-enum-to-select-which-class-to-instantiate – sgeddes

+0

@MichaelLiu, customerType ist eine enum im Moment und ist in der aufrufenden Methode –

Antwort

0

Hier ist eine Möglichkeit zu erreichen, was Sie wollen. Wir können es "Convention over Configuration Approach" nennen, da natürlich Ihre abgeleiteten Ordnungskategorien und Ihre Enumnamen übereinstimmen müssen.

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var customerType = CustomerType.Library; 
      var order = (Order)Activator.CreateInstance("ConsoleApplication2", "ConsoleApplication2." + customerType.ToString() + "Order").Unwrap(); 
     } 
    } 

    public enum CustomerType 
    { 
     Trade, 
     Library 
    } 

    public abstract class Order 
    { 
     public virtual void Export() { } 
    } 

    public class TradeOrder : Order 
    { 
     public override void Export() { } 
    } 

    public class LibraryOrder : Order 
    { 
     public override void Export() { } 
    } 
} 
0

Ich schlage vor, haben eine Karte von Objekttyp Name und Typ und erstellen Instanz auf der Grundlage der Zuordnung. Die Zuordnungsdetails können im Code oder von einer externen Quelle (z. B. Konfigurationsdatei) initialisiert werden.

enum OrderType 
    { 
     TradeOrder, 
     LibraryOrder 
    } 

    Dictionary<OrderType, Type> _orderTypeMap = new Dictionary<OrderType, Type> 
    { 
     { OrderType.LibraryOrder, typeof(LibraryOrder)}, 
     { OrderType.TradeOrder, typeof(TradeOrder)} 
    }; 

    Order GetOrderInstance(OrderType orderType) 
    { 
     return Activator.CreateInstance(_orderTypeMap[orderType]) as Order; 
    }