作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在保存一堆不同的对象并将它们重新加载到一个文件中,这些对象都是从一个公共(public)基础派生的,显然我需要存储类名(或类似的东西)以便在重新加载时创建正确的对象类型。
保存很容易:
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:上面的代码并没有试图成为最终工厂模式的完美代表。我不关心基类和派生类之间不需要的链接,也不关心扩展层次结构的潜在困难。我正在寻找能够简化代码而不是使其复杂化的答案。
最佳答案
这大概是你能做的最好的事情了,你可以通过将 if
包装在工厂类中来稍微清理一下。
关于C++ 多态加载/保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12459112/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!