我想使用这个简单的克隆界面。看起来它应该编译,但它没有。我收到一条消息说我的 BObject
类没有实现 DeepClone()
。我不明白这一点,因为我有一个 DeepClone()
方法和我的 BObject
类 implements IObject
。
interface IDeepCloneable<T>
{
T DeepClone();
}
interface IObject : IDeepCloneable<IObject>
{
string Name { get; }
double Sales { get; }
}
//'BObject' does not implement interface member
// 'IDeepCloneable<IObject>.DeepClone()'
class BObject : IObject
{
public string Name { get; set; }
public double Sales { get; set; }
public BObject DeepClone()
{
return new BObject() { Name = this.Name, Sales = this.Sales };
}
}
我是否声明了我的接口(interface)错误?
或者 DeepClone
实现?我可以使用这段代码:
public IObject DeepClone() //returns an IObject instead of a BObject
{
return new BObject() { Name = this.Name, Sales = this.Sales };
}
我遇到的问题是没有检查 BObject.DeepClone()
方法是否返回 BObject
作为结果。我可以有一个看起来像这样的类:
class BObjectImposter : IObject
{
public string Name { get; set; }
public double Sales { get; set; }
public IObject DeepClone()
{
//returns a BObject instead of a BObjectImposter
return new BObject() { Name = this.Name, Sales = this.Sales };
}
}
使用这个类,我可以这样写:
BObjectImposter objImp = new BObjectImposter();
IObject copy = objImp.DeepClone();
我可能认为 copy
是 BObjectImposter
的一个实现,但它实际上是一个不相关的类 BObject
的实现,它恰好也实现了IObject
。我知道接口(interface)的意义在于我使用哪个实现无关紧要,但这对我来说似乎不是好的代码。也许在我的 BObjectImposter
实现中的某个地方,我希望 DeepClone()
返回一个 BObjectImposter
对象。此外,IObject 的一个实现不应依赖于 IObject 的另一个实现。
也许我可以使IObject
成为一个抽象类并在那里声明DeepClone()
。如果我有一个实现(称为 ObjectA
),我需要在设置 Sales
之前设置 Name
,这似乎可能会破坏我的设计构造函数,以及另一个实现(称为 ObjectB
),我需要在构造函数中设置 Name
之前设置 Sales
。
最佳答案
正如您在问题中暗示的那样,IObject
实现了 IDeepClonable<IObject>,因此它的 DeepClone()
方法必须返回 IObject
.
您需要使用 CRTP一路走来:
interface IObject<T> : IDeepCloneable<T> where T : IObject<T>
class BObject : IObject<BObject>
(您还应该将 where T : IDeepCloneable<T>
添加到 IDeepCloneable
)
关于c# - 为什么我的克隆代码不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17089951/