装饰器模式和泛型
本文关键字:泛型 模式 | 更新日期: 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
。
我不知道你想达到什么目的,但这是一个开始。