我正在使用C++。 Vehicle
是一个类,Car
、Truck
、Ship
是它的子类。
想象一下,我有一个包含有关Vehicle
对象信息的文件file.vechicle
,该文件的第一个信息是车辆是Car
,Truck
还是Ship
。
文件的格式会根据文件描述的车辆而相应更改。
我在Vehicle
中定义了一个静态方法,该方法将.vehicle
文件作为输入,然后它确定该文件是描述Car
,Truck
还是Ship
,因此它在相应的类中调用私有方法来从文件构建对象。最后,静态方法返回正确的对象,因此Car
文件是否描述汽车,依此类推。
是否可以在不引入静态方法的情况下实现相同的目标,因此只需调用 Vehicle
的构造函数并Vehicle
根据文件的内容更改其标识?
不,C++对象不会更改其最派生的类型(这种行为可以或多或少地轻松模拟,像往常一样,需要一些性能成本,并且以以下约定为代价(。您正在使用某种工厂模式,在C++(和许多其他语言(中,其刻板型实现是通过返回盒装多态类型的静态方法完成的。
一种典型的解决方案是让 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;
};