2017-04-25 8 views
0

私は、デリゲートマッチデリゲートFUNCための過負荷<T, T>

クラスの私のスキームといくつかの問題があります。

public interface IWorker<T> where T : IModel 
{  
    T Do(T model); 
    T ReadyToWork(T model); 
} 

public abstract class Workers<T> : IWorker<T> where T : IModel 
{ 
    public abstract T Do(T model); 
    public abstract T ReadyToWork(T model); 
} 

クラスが動作するように! FirstModel : IModel

public class FirstWorker : Workers<ModelFirst> 
{ 
    public override ModelFirst Do(ModelFirst model) 
    { 
     return new ModelUserFirst(); 
    } 
    public override ModelFirst ReadyToWork(ModelFirst model) 
    { 
     throw new NotImplementedException(); 
    } 
} 

私は多くの仕事スペシャルクラスを作成することができ、それらで動作するように私は1つのアクセスポイントを作成:

public class WorkPoint<T> where T : IModel 
{ 
    public static Func<T, T> Do { get; set; } 
    public static Func<T, T> ReadyToWork{ get; set; } 

    public WorkPoint(ModelFirst mod) 
    { 
     Do = FirstWorker.Instance().Do; 
     ReadyToWork= FirstWorker.Instance().ReadyToWork; 
    } 
} 
OK

、と質問を。オン瞬間の割り当てDoReadyToWork私はキャッチエラー エラーCS'Do'のオーバーロードはデリゲート 'Func'に一致しません 何が間違っていますか?

+0

これらの状況では、何が起こっているのかを調べる最も簡単な方法は、存在しない変数に変数を割り当ててから、クイックアクションとリファクタリングを使用して変数を作成することです。変数の実際のシグネチャが表示され、一般的に何をしようとしていたのかが分かりません。 – Will

+1

ここに[mcve]を指定すると、UserFirstWorkerやそのインスタンスメソッドが表示されません。しかし、もしそれが 'FirstWorker'かそれに類するものであれば、誰かが' WorkPoint 'を使った場合、どうなるでしょうか? –

+0

これはあなたが共分散を使いたいと思うようです。 'Func 'は第2の 'T '上でのみ共変であるが、第1のものでは反復的であり、' Do'メソッドは 'T'と正確に一致しなければならない。 – juharr

答えて

-1

それは最もエレガントな解決策ではないのですが、これは動作します:

public class WorkPoint<T> where T : IModel 
{ 
    public Func<T, T> Do { get; } 
    public Func<T, T> ReadyToWork { get; } 

    protected WorkPoint(Func<T, T> f, Func<T, T> r) 
    { 
     Do = f; 
     ReadyToWork = r; 
    } 
} 

// Create a simple class like this for evert worker type you need 
public class FirstWorkPoint : WorkPoint<ModelFirst> 
{ 
    private FirstWorkPoint() : 
     base(FirstWorker.Instance().Do, FirstWorker.Instance().ReadyToWork) 
    { } 

    // Public method to get a new base instance 
    public static WorkPoint<ModelFirst> New() => new FirstWorkPoint(); 
} 

これが原因作成した追加のクラスにオーバーヘッドのビットが追加されますが、それは指摘されている共分散問題の回避策として行動しなければなりませんコメントの中で。

あなたがちょうどでした。この方法:

WorkPoint<ModelFirst> point = FirstWorkPoint.New(); 

編集:あなたはその基本Workers<T>クラスを必要としない場合にも、私はあなたがそれを取り除くことができ言うと、実際の労働者を持っていると思いますクラスはインターフェイスから直接継承します。結局のところ、基本クラスは上記のコードに追加の機能を提供しません。

+0

がありますが、共通の実現方法がいくつかあります。 「m」とは何ですか?私はこの解決策を私の解決策に追加し、現在のコンテキストには存在しません。 – jailbot

+0

@jailbot申し訳ありませんが、私は解決策を使って答えを更新しました:) – Sergio0694

+0

ありがとうございます。 – jailbot

関連する問題