我正在保存并重新加载一堆不同的对象,这些对象都从一个公共基础派生到一个文件中,显然我需要存储类名(或类似的名称)以便在重新加载时创建正确的对象类型。
保存很容易:
class Base
{
virtual string className() const = 0;
void saveToFile()
{
write(className());
... other writing stuff
}
}
class Derived1: public Base
{
string className() const { return "Derived1"; };
...
}
class Derived2: public Base
{
string className() const { return "Derived2"; };
...
}
而且,如果您不介意复制字符串,则加载很容易...
static Base * Base::factory(const String &cname)
{
if (cname == "Derived1")
return new Derived1;
else if (cname == "Derived2")
return = new Derived2;
else ...
}
void load()
{
String cname = readString();
Base * obj(Base::factory(cname);
obj->readIt();
}
但是,重复的字符串冒犯了我对 DRY 的感觉:理想情况下,className()
可能是这样static virtual
,但这是不允许的。我有一种感觉,我错过了一个明显的“干净”的方式,但我还看不到它。有什么建议么?
注意:好的,使用工厂方法稍微调整了代码。请注意,这实际上并不能解决问题!
注意#2:上面的代码并没有试图成为最终工厂模式的完美表示。我不关心基类和派生类之间不需要的链接,或者扩展层次结构的潜在困难。我正在寻找可以简化代码而不是使其复杂化的答案。