我的问题是关于合并两种技术:
假定具有递归函数(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];
};
所以我会是:
我正在尝试一些想法,但是它们似乎不好用或不能实现:
// 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
来仅更新单个对象。