c++ - C++ 中的接口(interface)类和工厂函数

标签 c++

在 Meyers Effective C++ 项目 31(我的第 3 版中的第 147 页)中,他谈到了接口(interface)类。他展示了一个带有纯虚方法和派生类 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 类时,为什么我要使用这个“创建”函数?

另外,为什么派生类方法是“虚拟的”。

编辑

感谢您的评论。我了解(现在)的目的,但我看不出它与任何层次结构中的任何基类有何不同 - 这种工厂函数在所有基类中都是典型的吗?它也有一种拼凑的感觉,而不是一种语言的一部分。但我对 C++ 比较陌生,所以这可能只是我的问题。

最佳答案

它用于在您有多个子类时选择正确的子类。

并将该逻辑保留在一个地方以使其可维护(面向对象+程序的家伙!!)

如果你有一个数据库或数据输入屏幕,可以存储或允许多个人输​​入,当你想编写一个函数来读取屏幕以创建新的人对象,或者从中加载记录时数据库,第一行不能是'new RealPerson(name);'。数据输入屏幕或数据库记录可能在谈论“ImaginaryFriend(name)”。在最简单的情况下,这将通过屏幕上的下拉菜单或数据库列中的代码/字符串来提供。

而且你无法创建“新人”——它是虚拟的。

因此,在开始将字段或数据库列加载到新对象之前,您可以通过调用工厂并向其传递“代码”(或其他与对象一致的“赠品”)来创建新对象,在最基本的情况下,工厂将检查(比如通过一个简单的 switch 语句)以确定调用哪个"new"。这样,您的程序就不会乱七八糟地使用 switch 语句来创建正确类型的具体对象。

当然,它可以变得比这更复杂。这只是一种情况,如果您确实使用继承,您在构建正确的子类时必须处理。

关于c++ - C++ 中的接口(interface)类和工厂函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154284/

相关文章:

c++ - 显式 int 类型作为参数

c++ - llvm::Type 结构的字符串表示

c++ - 在C++ 11中是否有任何等于asm (“”::: “memory”)的编译器障碍?

c++ - 如何更改字符串指针指向的字符?

java - 使用 Java 配置系统环境以调用 JNI 调用

c++ - 从另一个对象指向线程对象 : dangerous?

c++ - 如何在 XCode 的 cocos2d-x 项目中使用 sqlite3

c++ - 使用 decltype 转换一个值,这可能吗?

c++ - 为什么我的 cilk_spawn 循环比我的 cilk_for 循环做得更好?

c++ - windows上的linux开发