装饰器模式和泛型

本文关键字:泛型 模式 | 更新日期: 2023-09-27 18:01:18

常规接口:

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

类' compuationcache '是一个'装饰'计算:

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

…这会产生以下错误":

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

谁能评论一下用:

ComputationCache<T> : IComputation where T : IComputation

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

装饰器模式和泛型

首先,您应该使用:

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

如果您想使用您的缓存作为IComputation<T>并访问其Proxy属性,

第二个错误:

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

就这样做:

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

(我不知道为什么会有这个错误。因为computioncache是一个iccomputation,像T…)


编辑:嗯,我发现了一些使我的解决方案错误的东西:

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

这篇文章帮助找到这个关于泛型差异的错误

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

我不知道你想达到什么目的,但这是一个开始。