Class 设计:Class 成员继承自相同的基础 class
Class design: Class member inherits from the same base class
我正在为以下情况考虑适当的 class 设计:假设我想创建一个类似于(数学)函数的 class 设计。所有函数都派生自基数 class Function
。现在可以想到一个函数 FuncB
,它是 FuncA
的多个对象的总和。在我的例子中 FuncB
和 FuncA
是相当复杂的对象,但我当前的实现归结为:
class Function
{
virtual double value() = 0;
};
class FuncA : public Function
{
public:
virtual double value() {return v;}
private:
double v;
};
class FuncB : public Function
{
virtual double value() {
double result = 0;
for( auto i : v)
result += i.value();
return result;
}
private:
std::vector<DerivedA> v;
};
不知何故,我会认为这是一个糟糕的 class 设计,因为 FuncB
有一个成员继承自与 class 本身相同的基础 class。有什么建议可以更优雅地解决这个问题吗?
复合设计模式
class ContainerOfX : public X {
typedef X* bestType;
// maybe...
// typedef std::shared_ptr<X> bestType;
...
std::vector< bestType > subTypes;
};
它允许您创建一个绘图系统 - 不同形状的复合对象可以被视为一个集合体
obj->draw(); // draw house from various lines and boxes.
它允许您为 do/undo 逻辑创建一个简单的脚本。
我正在为以下情况考虑适当的 class 设计:假设我想创建一个类似于(数学)函数的 class 设计。所有函数都派生自基数 class Function
。现在可以想到一个函数 FuncB
,它是 FuncA
的多个对象的总和。在我的例子中 FuncB
和 FuncA
是相当复杂的对象,但我当前的实现归结为:
class Function
{
virtual double value() = 0;
};
class FuncA : public Function
{
public:
virtual double value() {return v;}
private:
double v;
};
class FuncB : public Function
{
virtual double value() {
double result = 0;
for( auto i : v)
result += i.value();
return result;
}
private:
std::vector<DerivedA> v;
};
不知何故,我会认为这是一个糟糕的 class 设计,因为 FuncB
有一个成员继承自与 class 本身相同的基础 class。有什么建议可以更优雅地解决这个问题吗?
复合设计模式
class ContainerOfX : public X {
typedef X* bestType;
// maybe...
// typedef std::shared_ptr<X> bestType;
...
std::vector< bestType > subTypes;
};
它允许您创建一个绘图系统 - 不同形状的复合对象可以被视为一个集合体
obj->draw(); // draw house from various lines and boxes.
它允许您为 do/undo 逻辑创建一个简单的脚本。