类设计:类成员继承自同一基类

3

我正在考虑以下情况的适当类设计:假设我想创建一个类设计,类似于(数学)函数。所有函数都从基类Function派生。现在可以想到一个函数FuncB,它是多个FuncA对象的总和。在我的情况下,FuncBFuncA是相当复杂的对象,但我的当前实现归结为:

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;
};

在某种程度上,我认为这是一个糟糕的类设计,因为FuncB有一个成员,它从与该类本身相同的基类继承。有什么更优雅的解决方法吗?


6
这是组合设计模式......它相当著名。 - StoryTeller - Unslander Monica
std::vector<Function*> v; 将会更加有用。 - Piotr Skotnicki
1
在运行时它必须是可重构的吗?还是在编译时你已经知道了你想要有哪些函数? - aerkenemesis
要使用accumulate,它必须是return std::accumulate(v.begin(), v.end(), 0.0, [](double result, const auto& f){ return result + f.value(); });。我认为我更喜欢OP的代码。 - Chris Drew
@hansgans - 如果您愿意,可以回答自己的问题。如果您提供了一个好的、完整的答案,我会点赞的 :) - StoryTeller - Unslander Monica
显示剩余4条评论
1个回答

1

组合模式

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逻辑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接