我已经阅读了有关感兴趣主题的几个问题,但仍然很难得出结论。如果这是一个多余的问题,我提前道歉。
直截了当,我的问题是尝试实施一个合乎逻辑的回报测试。例如,一种金融产品可能有几个条件,并且根据每个条件,收益会有所不同。但是,在收到合同之前,尚不清楚有多少条件。目标是编写一个回报实现,而不是在新产品出现时对每个 if 语句进行硬编码。例如,我首先收到一份只有一个条件的合同。第二天我收到了一份有两个条件等的合同。我知道这个问题可以用多态性来解决,但我很难解决。
收益本身是使用多态性编码的。
例如,我有一个抽象的通用支付类和具体的通用支付类。
class cPayoffAbstract
{
private:
public:
cPayoffAbstract(){}
virtual cPayoffAbstract* clone() const = 0;
virtual ~cPayoffAbstract(){}
virtual double operator()(double& x) const = 0;
};
class cPayoffConcrete1 : public cPayoffAbstract
{
private:
double y;
public:
cPayoffConcrete1(double& argY);
virtual cPayoffConcrete1* clone() const;
virtual ~cPayoffConcrete1(){}
virtual double operator()(double& x) const;
};
class cPayoffConcrete2 : public cPayoffAbstract
{
private:
double y;
public:
cPayoffConcrete2(double& argY);
virtual cPayoffConcrete2* clone() const;
virtual ~cPayoffConcrete2(){}
virtual double operator()(double& x) const;
};
然后我有另一个类来定义一个更复杂的支付接口。
#include <cPayoffAbstract.h>
#include <SmartPtr.h>
#include <vector>
class cConditionalPayoff
{
private:
// Some data members
public:
cConditionalPayoff(const SmartPtr<cPayoffAbstract>& argPayoffPtr1, const SmartPtr<cPayoffAbstract>& argPayoffPtr2);
// some methods ...
double fConditionalPayoff(const std::vector<double>& argXs, double& argY, double& argZ) const;
};
假设有一个条件很少的合同,并且根据条件将有不同的收益,这在通用收益类中实现。
double cConditionalPayoff::fConditionalPayoff(const std::vector<double>& argXs, double& argY, double& argZ) const
{
for (unsigned long i = 0; i < argXs.size(); i++)
{
if (argXs[i] > argY) { return dmPayoffPtr1->operator()(argXs[i]); }
else
{
if (argXs[i] < argZ) { return dmPayoffPtr2->operator()(argXs[i]); }
else { return argX[i]; }
}
}
}
例如,当合同中设计了具有相似收益但更多条件的不同合同时,就会出现问题。然后上面的 if 语句必须重新编码,或者必须实现另一种方法。
因此,目标是以fConditionalPayoff
动态方式实现,而不是在 ifs ad hoc 中进行编码。
我希望我的重新编辑有助于澄清一些误解。如果有的话,我很抱歉。
再次感谢你。