想象一下,你有一个通用接口,它定义了一个通用值和一个像这样的复制构造函数(替换 ICloneable):
// T: type of value to hold, TU: type of the class itself
interface ICopyable<T,TU> where TU: ICopyable<T,TU> {
T Value { get; set; }
TU Copy();
}
这可以通过像这样的布尔值持有者来实现:
class BooleanHolder : ICopyable<Boolean, BooleanHolder> {
public BooleanHolder Copy() {
return new BooleanHolder(){ Value = Value };
}
}
现在问题来了:你将如何定义一个包含另一个 ICopyable 的装饰器类?我不工作的想法是:
class DecoratingHolder<T,TU> : ICopyable<ICopyable<T,TU>, DecoratingHolder<T,TU>> {
public DecoratingHolder<T,TU> Copy {
// won't compile as Value is of type T and not of type ICopyable<T,TU>
// as I expected - why is that?
return new DecoratingHolder<T,TU>(){ Value = Value.Copy };
}
}
请注意,我Copy
还要求复制类型的值ICopyable<T,TU>
,这是为了确保深拷贝。
那么我必须改变什么才能使这个结构起作用呢?