gpt4 book ai didi

c# - 泛型类装饰器的copy方法如何实现?

转载 作者:行者123 更新时间:2023-11-30 12:12:29 24 4
gpt4 key购买 nike

假设您有一个通用接口(interface),它定义了一个通用值和一个像这样的复制构造函数(替换 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();
}

这可以通过像这样的 bool 值持有者来实现:

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> 类型的值复制,这是为了确保深度复制。

那么我必须更改什么才能使这个结构起作用?

最佳答案

您可能只需要添加一个约束。您定义 ICopyable<T, TU> where TU : ICopyable<T, TU>但在你的DecoratingHolder ,您永远不会明确约束 TU因此在 DecoratingHolder .

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

class DecoratingHolder<T,TU> : ***ICopyable<ICopyable<T,TU>***

这就是导致问题的原因。您正在定义 ICopyable<T,TU>类型,但是 TU没有被限制为 ICopyable<T, TU> . (人们可能能够从类声明/继承的其余部分推断,但编译器不会)添加约束后,编译器知道 Value是兼容的 ICopyable<T,TU>类型。

这对我来说编译得很好(必须用你提供的伪代码修复一些其他的小问题):

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 };
}
}

编辑:回想起来,您甚至需要对 ICopyable 进行约束吗? ?似乎并没有做太多,因为您已经普遍定义了传出类型。除非您在其他地方有代码取决于它返回 ICopyable<T, TU> 的事实出于某种原因(无论如何它本质上都会返回强类型 TUBooleanHolderDecoratingHolder )然后考虑转储它。

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 };
}
}

编辑:根据您要求深层复制的评论,然后保留约束(您将需要它们),并调用 CopyValue (对不起,我一定是错过了那个细节)

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() };
}
}

Copy任何给定类的方法都应确保它们执行深层复制。 (我建议将 Copy 重命名为 DeepCopy 如果您的框架需要它们是深拷贝并且您不希望实现不小心做浅层)

关于c# - 泛型类装饰器的copy方法如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com