假设我有以下类层次结构(包括基本接口):
IAction -> (abstract) BaseAction -> (concrete) ImmediateAction -> (concrete) MovementAction
现在,假设 IAction 公开了一个方法(好吧,实际上是 IAction 实现的不同接口,但让我们在这里保持简单!):
// Returns a new IAction instance deep copied from the current instance.
IAction DeepClone();
目前很好?我们有我们的深拷贝方法,并且ImmediateAction
有一些它想要复制的属性,所以它不仅提供了 的实现DeepClone()
,而且还提供了一个拷贝构造函数:
//Base Action implementation
protected BaseAction(BaseAction old)
{
this.something = old.something;
}
//Immediate Action Implementation
protected ImmediateAction(ImmediateAction old)
: base(old)
{
this.anything = old.anything;
}
public IAction DeepClone()
{
return new ImmediateAction(this);
}
现在,假设MovementAction
它里面没有任何与 a 相关的东西DeepClone()
,所以它没有实现方法或复制构造函数。
我遇到的问题是:
IAction x = new MovementAction();
IAction y = x.DeepClone();
//pleaseBeTrue is false
bool pleaseBeTrue = y is MovementAction;
现在,我明白这里发生了什么——MovementAction
没有实现DeepClone()
,所以ImmediateAction.DeepClone()
被调用,它实例化了一个新的ImmediateAction
. 因此,y
上面示例中的类型是ImmediateAction
而不是MovementAction
。
所以,在这个冗长的序言之后,我的问题是:这种情况的最佳实践是什么?我卡住了吗?我是否只需要为层次结构中的每个类都实现一个DeepClone()
方法 ?我在这里使用的模式是否不正确,还有更好的方法吗?
最后一点:如果可能的话,我想避免反思。