【发布时间】:2013-06-10 00:12:38
【问题描述】:
我想使用这个简单的克隆界面。看起来它应该编译,但它没有。我收到一条消息说我的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()。如果我有一个实现(称为ObjectA),我需要在构造函数中设置Sales 之前设置Name,以及我需要的另一个实现(称为ObjectB),这似乎可能会破坏我的设计在构造函数中设置Name之前设置Sales。
【问题讨论】: