2017-04-25 36 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(); 
    } 
} 

我可以創造許多工作特價類,我創建了一個接入點與他們一起工作:

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我捕捉錯誤 錯誤CS0123沒有過載'做'匹配代表'Func' 什麼錯了?

+0

在這些情況下,找出問題的最快方法是嘗試將其分配給不存在的變量,然後使用快速操作和重構爲您創建變量。然後你會看到變量的實際簽名,通常能夠弄清楚你爲什麼試圖做失敗。 – Will

+1

如果你在這裏提供[mcve]會有所幫助 - 例如,我們看不到'UserFirstWorker'或它的'Instance'方法。但是,如果它是「FirstWorker」或類似的,如果有人使用「WorkPoint 」,你會發生什麼? –

+0

這看起來像你想使用協變。 'Func '只對第二個'T'是協變的,但是與第一個相反,這意味着'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

相關問題