1

假设我有一个班级面孔。我希望使用合成来构建面部。Face 有眼睛,所以我可以创建一个 Eyes 类并使用合成将眼睛添加到 Face。

但是,如果我将眼睛子类化怎么办,例如

class Eyes { ... };
class BlueEyes : public Eyes { ... };
class BrownEyes : public Eyes { ... };

? (假设接口都是相同的。)

是否可以在运行时组合 Face,比如根据提供给构造函数的某些参数,Face 会得到 BlueEyes 或 BrownEyes?

4

2 回答 2

4

您可以通过编写一个指向基类的指针来做到这一点。例如,

enum EyeColor{Blue, Brown}; // Even better would be enum class

class Face
{
private:
    // Here is the composition - to a base-class ptr.
    std::unique_ptr<Eyes> m_eyes;

public:
    explicit Face(EyeColor c) 
    {
        // Use c to instantiate m_eyes below to the appropriate-class object.
    }
};

事实上,一些设计模式的 C++ 实现,例如Strategy,经常使用这个。

于 2016-02-13T13:55:24.830 回答
0

您正在寻找的是工厂设计模式。

您的工厂接收要实例化的类的名称和任何必需的参数,然后实例化适当的子类。该名称可以采用字符串、枚举类型或任何其他选择适当子类的方式的形式。让我们使用一个字符串:

Eyes *create_eyes(const std::string &color)
{
   if (color == "blue")
          return new BlueEyes;

   if (color == "brown")
          return new BrownEyes;

   throw "Unknown eye color";
}
于 2016-02-13T13:55:16.440 回答