我正在尝试构建一个 Monte Carlo 对象类,并且想知道设计相关类的最佳方法。
对象的结构(称为实体)包含名称、描述和分布类型,可以是几种不同的类型,例如。正态、固定整数、三角形等。分布类是(或可能是)特定分布的超类,例如。普通的。
所以我有
class Entity {
public:
string name;
Distribution* dsn; // superclass. Can this be done?
}
class Distribution {
public:
string Type;
double Sample(void)=0; // To be implemented in subclasses, same function sig.
}
那么实际分布的一个例子可能是
class NormalDistribution : public Distribution {
public:
setMean(double mean);
setStdDeb(double stddev);
double Sample(void);
}
FixedDistribtion 也将是 Distribution 的子类,并实现不同的方法,例如。setWeights、setValues 以及 Sample 当然。
我希望写这样的代码
Entity* salesVolume = new Entity();
salesVolume->setDistribution(NORM);
salesVolume->dsn->setMean(3000.0:
salesVolume->dsn->setStdDev(500.0);
Entity* unitCost = new Entity();
unitCost->dsn->setWeights( .. vector of weights);
unitCost->dsn->setValues( .. vector of values) ;
然后
loop
sv = salesVolume->sample();
uc = unitCost->sample();
endloop
我想做的是在实体中定义一个分布(超类),然后使用它的子类方法,这些方法取决于分布类型,例如。设置平均值。实体中的分发对象将在运行时确定,例如。if (distnType == NORM) dsn = new NormalDistribution; if (distnType == FIXED) dsn = new FixedDistribution;
这在 C++ 中是可能的,还是完全失去了多态的概念?我无法将 dsn 变量定义为超类,然后在运行时缩小到实际分布。一种(更简单)的方法是定义没有分发的实体,并自行使用分发,而不附加到实体。
多谢你们