如果所有必需的類都是由一些常見的基類派生這隻會工作,你一般會被限制使用的基本接口(雖然你可以工作圍繞這一點,一些額外的努力)。這裏有一個方法:
// Immutable core code:
#include <map>
#include <string>
class Base
{
typedef Base * (*crfnptr)(const std::string &);
typedef std::map<std::string, crfnptr> CreatorMap;
static CreatorMap creators;
public:
virtual ~Base() { }
Base * clone() const { return new Base(*this); }
static Base * create_from_string(std::string name)
{
CreatorMap::const_iterator it = creators.find(name);
return it == creators.end() ? NULL : it->first();
}
static void register(std::string name, crfnptr f)
{
creators[name] = f;
}
};
現在你可以從你的新代碼添加新的派生類:
// your code:
#include "immutable_core.hpp"
class Foo : public Base
{
public:
Foo * clone() const { return new Foo(*this); }
static Foo * create() { return new Foo; }
};
Base::register("Foo", &Foo::create);
要創建一個類,你只需撥打Base * p = Base::create_from_string("Foo");
。
@CharlesB你不需要反思,你可以使用工廠。 –
@LuchianGrigore:工廠是一種設計模式,反射是一種語言特徵。如果你想要一個沒有if..else..else的工廠,你需要一個有反射的語言,或者一個二進制插件架構,就像在Alessandro的回答中一樣 – CharlesB