C# 如何实现泛型类的decorator的copy方法?
假设您有一个定义泛型值的泛型接口和这样的复制构造函数(替换IClonable):C# 如何实现泛型类的decorator的copy方法?,c#,generics,copy,decorator,C#,Generics,Copy,Decorator,假设您有一个定义泛型值的泛型接口和这样的复制构造函数(替换IClonable): //T:要保存的值的类型,TU:类本身的类型 接口可图标化,其中TU:ICopyable{ T值{get;set;} TU Copy(); } 这可以由如下布尔值持有者实现: 类布尔持有者:可复制{ 公共布尔持有者副本(){ 返回新的BooleanHolder(){Value=Value}; } } 现在问题来了:您将如何定义一个包含另一个ICopyable的decorator类?我的想法是: 类装饰文件夹:可
//T:要保存的值的类型,TU:类本身的类型
接口可图标化,其中TU:ICopyable{
T值{get;set;}
TU Copy();
}
这可以由如下布尔值持有者实现:
类布尔持有者:可复制{
公共布尔持有者副本(){
返回新的BooleanHolder(){Value=Value};
}
}
现在问题来了:您将如何定义一个包含另一个ICopyable的decorator类?我的想法是:
类装饰文件夹:可复制{
公共装潢复制件{
//不会编译,因为值的类型为t,而不是ICopyable类型
//正如我所预料的,为什么会这样?
返回新的decoringholder(){Value=Value.Copy};
}
}
请注意,我调用了Copy
来同时复制typeICopyable
的值,这是为了确保深度复制
那么,要使此结构正常工作,我需要做哪些更改?您可能只需要添加一个约束。您定义了
ICopyable,其中TU:ICopyable
但在decoringholder
中,您从未明确地将TU
约束为decoringholder
更具体地说,我认为是这一部分:
class DecoratingHolder<T,TU> : ***ICopyable<ICopyable<T,TU>***
编辑:回想起来,您是否需要在ICopyable
上设置该约束?似乎没有做多少工作,因为您已经一般性地定义了传出类型。除非你在别处有代码,否则它依赖于它返回代码>可编辑的< /代码>由于某种原因(本质上它将返回一个强类型的<代码> TU<代码>或<代码> BooLoNealths或interface ICopyable<T,TU>
{
T Value { get; set; }
TU Copy();
}
class BooleanHolder : ICopyable<Boolean, BooleanHolder>
{
public bool Value { get; set; }
public BooleanHolder Copy() {
return new BooleanHolder(){ Value = Value };
}
}
class DecoratingHolder<T,TU> : ICopyable<ICopyable<T,TU>, DecoratingHolder<T,TU>>
{
public ICopyable<T,TU> Value { get; set; }
public DecoratingHolder<T,TU> Copy() {
return new DecoratingHolder<T, TU>(){ Value = Value };
}
}
然后,任何给定类的Copy
方法都应该确保它们执行深度复制。(我建议将Copy
重命名为DeepCopy
,如果您的框架需要它们是DeepCopy,并且您不希望实现意外地变浅)一个cast适合我:
public DecoratingHolder<T, TU> Copy()
{
return new DecoratingHolder<T, TU>() { Value = (ICopyable<T, TU>)Value.Copy() };
}
公共装饰文件夹副本()
{
返回新的decoringholder(){Value=(ICopyable)Value.Copy()};
}
我猜在这种情况下,编译器甚至没有确定
TU
和ICopyable
是同一件事。@ChrisSinclair啊,对不起,我刚刚注意到我忘了提到实现深度拷贝的必要性。你会调整你的计划吗answer@Bastian对不起,我忽略了那个细节。我添加了另一个编辑。
class DecoratingHolder<T,TU> : ICopyable<ICopyable<T,TU>, DecoratingHolder<T,TU>>
where TU : ICopyable<T,TU>
{
public ICopyable<T,TU> Value { get; set; }
public DecoratingHolder<T,TU> Copy() {
return new DecoratingHolder<T, TU>(){ Value = Value.Copy() };
}
}
public DecoratingHolder<T, TU> Copy()
{
return new DecoratingHolder<T, TU>() { Value = (ICopyable<T, TU>)Value.Copy() };
}