我有一个像这样的插值器的类层次结构:
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
答案 0 :(得分:2)
您需要Factory Design Pattern - 甚至Abstract Factory。
保持命名方案 - 它应如下所示:
class BaseInterpolatorFactory
{
public:
virtual ~BaseInterpolatorFactory() = default;
virtual std::unique_ptr<BaseInterpolator> CreateObject() = 0;
};
E.g。 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;
};
所以 - 在客户端代码中,不要传递一些参数的组合结构/联合/鉴别器 - 只需传递BaseInterpolatorFactory&