0

常规界面:

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' 是一个 'decorated' 计算:

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

对比

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

1 回答 1

0

首先,您应该使用:

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

如果您想将缓存用作 aIComputation<T>并有权访问其Proxy属性。

其次,对于您的错误:

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

只需这样做:

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

(不知道为什么会出现这个错误。由于ComputationCache是​​一个IComputation,就像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

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

于 2016-08-10T13:11:50.840 回答