加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:24:32 所属栏目:百科 来源:网络整理
导读:在Meyers Effective C项目31(我的第3版中的第147页)中,他谈到了接口类.他展示了一个使用纯虚方法和派生类RealPerson的Person类的示例.它看起来像这样,虽然我已经简化它并添加了琐碎的实现. #include stringclass Person {public: virtual ~Person() {}; virt
在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语句来制作正确的具体对象.

当然,它可能比这更复杂.这只是一种情况,如果您使用继承,则必须在构建正确的子类时进行处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读