在Meyers Effective C项目31(我的第3版中的第147页)中,他谈到了接口类.他展示了一个使用纯虚方法和派生类RealPerson的Person类的示例.它看起来像这样,虽然我已经简化它并添加了琐碎的实现.
#include <string> class Person { public: virtual ~Person() {}; virtual std::string name() const = 0; }; class RealPerson : public Person { public: RealPerson(const std::string& name) : theName(name) {} virtual ~RealPerson() {}; virtual std::string name() const { return theName; } private: std::string theName; };
然后他继续说我们可以轻松创建一个“工厂功能”来创造真实的人:
std::shared_ptr<Person>Person::create(const std::string& name) // EDIT - removed tr1:: { return std::shared_ptr<Person>(new RealPerson(name)); }
当我能以正常方式实例化RealPerson类时,为什么我要使用这个’create’函数?
另外,为什么派生类方法是“虚拟的”.
编辑
感谢您的评论.我理解目的(现在),但我不知道它与任何层次结构中的任何基类有何不同 – 这些工厂函数是否在所有基类中都是典型的?它也有一种kludge的感觉,而不是语言的一部分.但我对C来说比较新,所以这可能只是我的问题.
解决方法
当你有多个子类时,它是为了选择正确的子类.
并将该逻辑保留在一个地方以使其可维护(OO程序性人!)
如果您有一个可以存储或允许多个人输入的数据库或数据输入屏幕,当您想要编写一个函数来读取屏幕来创建新的人物对象,或者从数据库加载记录时,第一行不能是’new RealPerson(name);’.数据输入屏幕或数据库记录可能正在讨论’ImaginaryFriend(name)’.在最简单的情况下,这将通过屏幕上的下拉列表或数据库中列中的代码/字符串来给出.
你不能创造’新人’ – 它是虚拟的.
因此,在开始将字段或数据库列加载到新对象之前,您可以通过调用工厂并向其传递“代码”(或其他“赠品”以确定对象是否一致)来创建新对象,最基本的情况,将由工厂检查(例如通过一个简单的开关声明)来确定要调用的“新”.这样,你的程序就不会乱用switch语句来制作正确的具体对象.
当然,它可能比这更复杂.这只是一种情况,如果您使用继承,则必须在构建正确的子类时进行处理.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。