微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C语言中的接口类和工厂函数

在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 举报,一经查实,本站将立刻删除。

相关推荐