我正在实现一个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;
}

09-07 07:17