装饰图案和泛型

时间:2016-08-08 20:36:37

标签: c# generics decorator proxy-pattern

常规界面:

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

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

...出现以下错误“:

  

无法将源类型'ComputationCache'转换为目标类型'T'。

有人可以评论是否更好用:

ComputationCache<T> : IComputation where T : IComputation

VS

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

1 个答案:

答案 0 :(得分:0)

首先,你应该使用:

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

如果您想将缓存用作IComputation<T>并且可以访问其Proxy属性。

其次,为您的错误:

  

无法转换来源类型&#39; ComputationCache&#39;定位类型&#39; T&#39;。

这样做:

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

我不知道你想要达到的目标,但这只是一个开始。