c++ - 通过传递不同的参数创建对象

标签 c++ oop design-patterns

我有一个像这样的插值器的类层次结构:

class BaseInterpolator
{
public:
    virtual ~BaseInterpolator();

    virtual float GetInterpolation(const float input) const = 0;
};

class AccelerateInterpolator : public BaseInterpolator
{
public:
    explicit AccelerateInterpolator(const float factor = 1.0f);
    virtual float GetInterpolation(const float input) const override;
private:
    float m_factor;
};

class AnticipateOvershootInterpolator : public BaseInterpolator
{
public:
    explicit AnticipateOvershootInterpolator(const float tension = 2.0f, const float extraTension = 1.5f);
    virtual float GetInterpolation(const float input) const override;
private:
    float m_tension;
    float m_extraTension;
};

我希望能够使用不同的参数构造这些对象。但是,对于来自 BaseInterpolator 的每种可能的派生类型,有不同数量的参数,即 AccelerateInterpolator 有 1 个,AnticipateOvershootInterpolator 有 2 个。我也有类抽象客户端传递给我的库的属性,该库根据这些属性创建插值器:

struct AnimationProperties
{
    enum class Curve
    {
        Accelerate,
        AnticipateOvershoot,
    };

    Curve curve;
    uint32_t duration{ 0 };
};

我想增加用户通过 AnimationProperties 传递不同参数的可能性,这样我就可以使用这些参数创建参数化插值器。到目前为止,我一直使用非参数化插值器。我不知道我应该如何处理这个问题。我应该以某种方式使用访问者,或者正确的方法是什么?

顺便说一句。用户只能看到 AnimationProperties

最佳答案

您需要Factory Design Pattern - 甚至Abstract Factory .

保留您的命名方案 - 它应该如下所示:

class BaseInterpolatorFactory
{
public:
    virtual ~BaseInterpolatorFactory() = default;
    virtual std::unique_ptr<BaseInterpolator> CreateObject() = 0;
};

例如AnticipateOvershootInterpolator 的实现:

class AnticipateOvershootInterpolatorFactory : public BaseInterpolatorFactory
{
public:
    AnticipateOvershootInterpolatorFactory (float tension, float extraTension);
    std::unique_ptr<BaseInterpolator> CreateObject() override
    {
         return std::make_unique<>(m_tension, m_extraTension);
    }
private:
    float m_tension;
    float m_extraTension;
};

因此 - 在客户端代码中,不要传递一些组合的结构/union/鉴别器参数 - 只需传递 BaseInterpolatorFactory&

关于c++ - 通过传递不同的参数创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49635056/

相关文章:

c++ - 为什么我们不能添加两个指针?

c# - 我应该在这里使用工厂吗

php - 状态设计模式对于 PHP 表单是否过大?

javascript - 关于 JS 中 OOP 的一些基本问题

c# - 如何解决这个通用的存储库模式问题?

c++ - oo游戏的 "concept"

c++ - boost 单元测试 visual studio 未显示在控制台中

c++ - 将二进制文件添加到其他人的柯南食谱中

c++ - 无法覆盖继承的静态常量成员

c# - 从抽象集合中生成抽象集合