常规界面:
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
答案 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
。
我不知道你想要达到的目标,但这只是一个开始。