我的问题是关于合并两种技术:

  • 递归调用 super 函数
  • 递归调用相同的函数

  • 假定具有递归函数(foo)的根类和重写此函数的扩展类(foo):覆盖函数必须调用super::foo,但需要执行其他操作才能递归调用。

    我将尝试一个示例(这只是一个示例,并且我知道有解决此问题的非递归方法)
    class Node
    {
    public:
        // must be override
        virtual int getNumValues()
        {
            if (parent) return parent->getNumValues() + 3;
            else return 3;
        }
    protected:
        Node *parent;
    private:
        int values[3];
    };
    
    class ExtNode: Node
    {
    public:
        //@override
        virtual int getNumValues()
        {
            int aux = Node::getNumValues(); //but need to avoid recursion here.
            if (parent) return parent->getNumValues() + aux + 2;
            else return aux + 2;
        }
    private:
        int extValues[2];
    };
    

    所以我会是:
  • 我可以更改两个类:Node和ExtNode。
  • 为了避免 super 调用(类链可能很长),我不会将代码从第一类方法复制到第二种方法
  • 递归调用可能应该由最小的类
  • 完成

    我正在尝试一些想法,但是它们似乎不好用或不能实现:
    // In Node class
    ...
    virtual int getNumValues()
    {
        if (parent && !isNodeObject(this)) return parent->getNumValues()+3;
        else return 3;
    }
    bool isNodeObject( Node *ob)
    {
        //return if ob is instance of Node (and not an extended class). How?
    }
    

    我也尝试过使用可选参数:
    // In Node class
    ...
    virtual int getNumValues( bool recursion = true)
    {
        if (parent && recursion) return parent->getNumValues()+3;
        else return 3;
    }
    
    // In ExtNode class
    ...
    virtual int getNumValues( bool recursion = true)
    {
        int aux = Node::getNumValues(false );
        if (parent && recursion) return parent->getNumValues() + aux + 2;
        else return aux + 2;
    }
    

    最佳编程实践是什么?

    编辑1:我要解决的真正问题的解释(从约阿希姆·皮勒博格问)

    我正在创建一个用户界面库,即一组类和函数,以轻松创建框架,按钮,输入文本等小部件。

    我创建了一个具有大多数常规功能的基本(根类)窗口小部件,一个“可见”窗口小部件,以实现具有可见部分的窗口小部件的所有通用功能,等等。

    还有一些容器,例如框架,布局和窗口。

    现在来个困难的部分:有一个函数“updateStyle”,该函数应该立即更新小部件的所有图形部分(并重新绘制):该函数递归调用父类(super class)以执行更通用的功能,并且还必须递归调用容器以传播更改(窗口小部件的尺寸和位置可能会更改)

    每个小部件都应该“按此方式”工作并且可以扩展,这就是这些要求的原因。

    代码范围广泛(约8k行),并具有许多其他功能,因此在这里没有必要复制
    代码。

    最佳答案

    似乎您正在搜索模板方法模式:

    在基类中的

  • 中,实现概述该功能一般行为的非虚拟方法。
  • 定义(抽象)虚拟方法,这些方法定义函数
  • 内部的特殊行为部分
    派生类中的
  • ,覆盖特殊行为
    class Node
    {
    public:
      int getAllNumValues()
      {
        int allNumValues = getNumValues();
    
        if (parent) allNumValues += parent->getAllNumValues();
    
        return allNumValues;
      }
    
    protected:
      virtual int getNumValues() {
         return 3;
      };
    private:
      Node *parent;
      int values[3];
    };
    
    class ExtNode: Node
    {
    protected:
      //@override
      virtual int getNumValues()
      {
        return 2 + Node::getNumValues(); //but need to avoid recursion here.
      }
    private:
      int extValues[2];
    };
    

  • 如果您具有更新功能,我建议您使用一个模板方法update来递归更新您的复合模式,并推荐另一个方法updateThis来仅更新单个对象。

    07-24 09:45
    查看更多