[英]Why doesn't my clone code compile?
我有一个想要使用的简单克隆界面。 看起来它应该编译,但不是。 我收到一条消息,说我的BObject
类未实现DeepClone()
。 我不明白这一点,因为我有一个DeepClone()
方法,而我的BObject
类实现了 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 };
}
}
我在声明接口错误吗?
还是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
。 我知道接口的意义在于我使用哪种实现都无关紧要,但这对我来说似乎不是好的代码。 也许在我的BObjectImposter
实现中的某个地方,我希望DeepClone()
返回一个BObjectImposter
对象。 同样,IObject的一种实现不应依赖于IObject的另一种实现。
也许我可以将IObject
DeepClone()
抽象类,然后在其中声明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
)
这是因为IObject继承了IDeepCloneable<IObject>
所以DeepClone
将返回IObject
。 以下应该工作:
interface IDeepCloneable<T>
{
T DeepClone();
}
interface IObject<T> : IDeepCloneable<T>
{
string Name { get; }
double Sales { get; }
}
//'BObject' does not implement interface member
// 'IDeepCloneable<IObject>.DeepClone()'
class BObject : IObject<BObject>
{
public string Name { get; set; }
public double Sales { get; set; }
public BObject DeepClone()
{
return new BObject() { Name = this.Name, Sales = this.Sales };
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.