2016-08-05 21 views
-1

我有一個從抽象類動態創建這是從一個抽象類

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爲customertype「貿易」創建LibraryOrder爲customertype「圖書館創造派生2類派生的類的實例」。

客戶類型將在不久的將來增長。

如何根據客戶類型創建派生類的實例,而不使用if ... else或swicth ... case?

該類的實例將調用導出方法來創建或更新銷售訂單。

-Alan-

+0

您如何在代碼中表示客戶類型?例如,您是否每個客戶類型都有一個類,它們都來自基類Customer類? –

+0

這有幫助嗎? http://stackoverflow.com/questions/17835839/use-an-enum-to-select-which-class-to-instantiate – sgeddes

+0

@MichaelLiu,customerType是一個枚舉,並在調用方法中定義 –

回答

0

這是一種實現你想要的方法。我們可以將它稱爲「約定優於配置方法」,因爲很明顯,您的派生訂單類型名稱和枚舉名稱必須匹配。

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

我建議有一個對象類型名稱和類型的映射,並基於映射創建實例。映射細節可以在代碼或外部源(例如配置文件)中初始化。

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; 
    }