我正在实现一个virtual clone()
方法,除了返回的对象的“实际”类型之外,该方法可以完全相同,并且我意识到将会有很多重复。例如,这是我要避免的明显解决方案:
AbstractVehicle* ConcreteCar::clone() const
{
auto c = new ConcreteCar;
c->setSomething(this->getSomething());
return c;
}
AbstractVehicle* ConcreteJet::clone() const
{
auto j = new ConcreteJet;
j->setSomething(this->getSomething());
return j;
}
这就是我想要的:
AbstractVehicle* AbstractVehicle::clone() const
{
auto v = new this->ACTUAL_CLASS;
v->setSomething(this->getSomething());
return v;
}
有没有简单的方法可以做到这一点?如果不是这样,我很想知道为什么会这样,因为天真的实现起来似乎比动态调度更像是一个挑战。
最佳答案
根据定义您的setSomething / getSomething函数的小时数,您可能可以保留一个克隆,而只对“create me”类型的函数进行覆盖。例如:
AbstractVehicle* ConcreteCar::MakeNew() { // virtual method
return new ConcreteCar();
}
这将从基类克隆中调用:
AbstractVehicle* AbstractVehicle::Clone() {
auto j = MakeNew();
j->setSomething(this->getSomething());
return j;
}