C# 如何实现泛型类的decorator的copy方法?

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类?我的想法是: 类装饰文件夹:可

假设您有一个定义泛型值的泛型接口和这样的复制构造函数(替换IClonable):

//T:要保存的值的类型,TU:类本身的类型
接口可图标化,其中TU:ICopyable{
T值{get;set;}
TU Copy();
}
这可以由如下布尔值持有者实现:

类布尔持有者:可复制{
公共布尔持有者副本(){
返回新的BooleanHolder(){Value=Value};
}
}
现在问题来了:您将如何定义一个包含另一个ICopyable的decorator类?我的想法是:

类装饰文件夹:可复制{
公共装潢复制件{
//不会编译,因为值的类型为t,而不是ICopyable类型
//正如我所预料的,为什么会这样?
返回新的decoringholder(){Value=Value.Copy};
}
}
请注意,我调用了
Copy
来同时复制type
ICopyable
的值,这是为了确保深度复制


那么,要使此结构正常工作,我需要做哪些更改?

您可能只需要添加一个约束。您定义了
ICopyable,其中TU:ICopyable
但在
decoringholder
中,您从未明确地将
TU
约束为
decoringholder

更具体地说,我认为是这一部分:

class DecoratingHolder<T,TU> : ***ICopyable<ICopyable<T,TU>***
编辑:回想起来,您是否需要在
ICopyable
上设置该约束?似乎没有做多少工作,因为您已经一般性地定义了传出类型。除非你在别处有代码,否则它依赖于它返回代码>可编辑的< /代码>由于某种原因(本质上它将返回一个强类型的<代码> TU<代码>或<代码> BooLoNealths或 DealthItHuffer-<代码>)然后考虑倾倒它。
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() };
    }