我有一个像这样的插值器的类层次结构:
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/