我正在使用C ++。
Vehicle
是一个类,Car
,Truck
,Ship
是其子类。
想象一下,我有一个文件file.vechicle
,其中包含有关Vehicle
对象的信息,此文件的第一个信息之一是车辆是Car
,{{1或Truck
。
文件格式相应地改变了文件描述的车辆。
我在Ship
中定义了一个静态方法,它将Vehicle
文件作为输入,然后确定该文件是描述.vehicle
,Car
还是{ {1}}因此它调用相应类中的私有方法来从文件构建对象。
最后,静态方法返回正确的对象,如果文件正在描述汽车,则为Truck
,依此类推。
是否可以实现相同的功能,但不引入静态方法,因此只需调用Ship
的构造函数并让Car
根据文件内容更改其标识?
答案 0 :(得分:1)
不,C ++对象不会更改它们的派生类型(这种行为可以或多或少地模拟,对于某些性能成本,像往常一样,以及以下约定的价格)。你在C ++(以及许多其他语言)中使用的是Factory模式,它的定型实现是通过静态方法完成的,返回盒装的多态类型。
一个典型的解决方案是Vehicle
类型在内部封装具体实现。这甚至可以构建它:
class Carrier {
public:
virtual void go() = 0;
virtual ~Carrier() {}
};
class Car: public Carrier;
class Ship: public Carrier;
struct Vehicle /* you can even add ': Carrier' here, just don't make Vehicle run on itself */
{
Vehicle(std::string const &spec): impl(spec == "car"? new Car : new Ship) {}
void go() { return impl->go(); }
private:
std::unique_ptr<Carrier> impl;
};