2016-08-08 74 views
0

常規接口:Decorator模式和泛型

public interface IComputation 
{ 
    void Reset(); 
    float GetValue1(); 
    float GetValue2(); 
} 

通用接口:

public interface IComputation<T> : IComputation where T : IComputation 
{ 
    T Proxy { get; set; } 
} 

現在的類:

public abstract class Computation<T> : IComputation<T> where T : IComputation 
{ 
    public T Proxy { get; set; }  
} 

班 'ComputationCache' 是「裝飾」的計算:

internal abstract class ComputationCache<T> : IComputation where T : IComputation 
{ 
    public T Proxy { get; set; }  

    public float GetValue1() 
    { 
     bool isCached = //check cache. 
     if(!isCached) 
     { 
      //compute value 
      float value1 = Proxy.GetValue1();       

      //update cache 

      return value; 
     }  
    } 
} 

要初始化裝飾計算,我試過如下:

public ComputationCache(IComputation<T> proxy) 
{ 
    Proxy = (T) proxy; 
    proxy.Proxy = this; 
} 

...它提供了以下錯誤「:

Cannot convert source type 'ComputationCache' to target type 'T'.

可以在它是否是更好有人評論使用方法:

ComputationCache<T> : IComputation where T : IComputation 

VS

ComputationCache<T> : IComputation<T> where T : IComputation 
+8

你的抽象看起來有點過分 – Rahul

+1

我必須說,你失去了我 –

+0

@Rahul。上面顯示的類是抽象的,並且被多個Computation的子類進行分類,以及從基類緩存類派生的相應的「ComputationCache」。我試圖避免在下層重複投射'Proxy'屬性 – alhazen

回答

0

首先,你應該使用:

ComputationCache<T> : IComputation<T> where T : IComputation 

如果你想使用緩存爲IComputation<T>,並已獲得其Proxy財產。

其次,對於您的錯誤:

Cannot convert source type 'ComputationCache' to target type 'T'.

只是這樣做:

proxy.Proxy = (T)(IComputation)this; 

(我不知道爲什麼會出現這種錯誤。由於ComputationCache是​​IComputation,像T.。 ..)


編輯:嗯我發現一樣東西讓我的解決方案錯誤:

new ComputationCache<Computation<IComputation>>(new Computation<Computation<IComputation>>()); 

這篇文章幫助找到這個錯誤有關Generics variance

T變得Computation<IComputation>,是不是等於ComputationCache類型。

您可能會遇到一些麻煩,使您在編寫Proxy屬性時發揮作用。

你可能想要做這樣的事情,那麼:

public interface IComputation 
{ 
    IComputation Proxy { get; set; } 
    // Other stuff 
} 

public interface IComputation<T> : IComputation where T : IComputation 
{ 
    new T Proxy { get; set; } 
    // Other stuff 
} 

但你必須管理兩個屬性Proxy

我不知道你在努力達成什麼,但這是一個開始。