Мой вопрос о слиянии двух методов:
- Вызов рекурсивно для суперфункций
- Вызовите рекурсивно ту же функцию
Предположим, что корневой класс имеет рекурсивную функцию (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: Объяснение реальной проблемы, которую я пытаюсь решить (спросил Иоахим Пилеборг)
Я создаю библиотеку пользовательского интерфейса, то есть набор классов и функций для создания легко виджетов, таких как кадр, кнопки, входные тексты и т.д.
Я создал базовый (корневой класс) виджет с большинством общих функций, виджет "Видимый" для реализации всех общих функций для виджетов, которые имеют видимую часть, и soo on.
Существуют также некоторые контейнеры, такие как фреймы, макет и окна.
Теперь пришла трудная часть: есть функция "updateStyle", которая должна сразу обновлять всю графическую часть виджета (и перерисовывать ее): эта функция рекурсивно вызывает суперкласс для выполнения более общих функций и также необходимо вызывать рекурсию в контейнеры для распространения изменений (размеры и позиции виджетов могут меняться)
Каждый виджет должен работать "как это", а также быть расширяемым, поэтому эти требования.
Код обширен (около 8 тыс. строк) и имеет множество других функций, поэтому не нужно копировать здесь код.