2016-06-23 6 views
0

と工場での委任辞書パターンの使い方:私は現在、このようになりますファクトリクラスを持つパラメータ

public static class OrderFactory 
{ 
    public static Order GetOrder(OrderInformation orderInfo, Logger logger, string overlayPath) 
    { 
     switch (orderInfo.Type) 
     { 
      case OrderType.Print: 
       return new Print(orderInfo, logger, overlayPath); 
      case OrderType.Cad: 
       return new Cad(orderInfo, logger, overlayPath); 
      case OrderType.Litho: 
       return new Litho(orderInfo, logger, overlayPath); 
      case OrderType.Error: 
      default: 
       return new OrderError(orderInfo, logger, overlayPath); 
     } 
    } 
} 

public abstract class Order 
    { 
     protected OrderInformation OrderInfo { get; set; } 
     protected Logger Logger { get; set; } 
     protected string OverlayPath { get; set; } 
     public Order(OrderInformation orderInfo, Logger logger, string overlayPath) 
     { 
      OrderInfo = orderInfo; 
      Logger = logger; 
      OverlayPath = overlayPath; 
     } 
     public abstract Task<bool> CreateImage() 
    } 

public class Print : Order 
    { 
     public Print(OrderInformation orderInfo, Logger logger, string overlayPath) 
      : base(orderInfo, logger, overlayPath) 
     { } 

     public override async Task<bool> CreateThumbs(CorelAppWrapper corelAppWrapper, int timeBeforeFirstAbort, int timeBeforeRetryAbort) 
     { 

私はswitch文を使用しないように、主にデリゲートパターンまたは何か他のものを使用したいとも知っているだろうある日、この方法をすばやく拡張する必要があります。 Delegate Dictionary Patternなどを使用したいそれはこの方法がPrintタイプがOrder型に変換することができないというエラーがスローされます行う

private delegate Order Order(OrderInformation orderInfo, Logger logger, string overlayPath); 

    private static readonly Dictionary<OrderType, Order> 
      mTypeConstructors = new Dictionary<OrderType, Order> 
      { 
       { OrderType.Print, (orderInfo, logger, overlayPath) => new Print(orderInfo, logger, overlayPath) }, 
       ...//etc 
      }; 

:私はこのようなコードを試してみました。これを回避するには何ができますか?

+1

をオブジェクトの作成を移動しましたか? – Diosjenin

+0

@Diosjenin - いいえ、ScreenPrintは印刷する必要があります。私はそれを修正した。良いキャッチ。 –

+1

@BenHoffman、 'Transfer'型と' Order'-hierarchyの型の定義を投稿してください。 –

答えて

0

私はあなたのコードにいくつかの変更を加えてそれを達成しました。私は `Print`があなたのswitch文に一致するように、` ScreenPrint`する必要はない(more detail)簡単にするために、コンストラクタから

public static Order GetOrder(OrderInformation orderInfo, Logger logger, string overlayPath) 
    { 
     return mTypeConstructors[orderInfo.Type](orderInfo, logger, overlayPath);   
    } 


    private static readonly Dictionary<OrderType, Func<OrderInformation, Logger, string, Order>> 
    mTypeConstructors = new Dictionary<OrderType, Func<OrderInformation, Logger, string, Order>> 
       { 
       { OrderType.Print, Print.Create }, 
       ///... 

       }; 


    public class Print : Order 
    { 
     ... 

     public static Print Create(OrderInformation orderInfo, Logger logger, string overlayPath) 
     { 
      ... 
     } 
+0

リンク先はここではあまり適用されません。デリゲートとしてコンストラクタを使用することはできませんが、OPはそれをしていません - コンストラクタへの呼び出しの結果*を返す関数*実装*を指定しています。例えば、 'MakeLst one = new List (1);'と一緒に 'delegate List MakeLst (int count);を定義することはできませんが、' MakeLst 1 =(i)=>新しいリスト(1); '前者はコンストラクタであり、後者はコンストラクタへの呼び出しから内部的に戻り値を生成するラムダです。 – Diosjenin

関連する問題