_PitrakSarkar_ Ответов: 1

Удаление дублирования кода для виртуальных членов класса


Теперь я попал в странную ситуацию. Я напишу действительно упрощенную версию того же самого.
class Base
{
public:
virtual int func1()=0;
virtual int func2()=0;
protected:
int n;
};

class der1: public Base
{
//implements the virtual functions of the base and uses the protected data members of the base.
};

class der2: public Base
{
//implements the virtual functions of the base and uses the protected data members of the base.
}


Теперь проблема ... и der1, и der2 реализуют виртуальные функции базы почти одинаково. Но некоторые другие классы (der3, der4) имеют свои собственные реализации. Но все равно нужно наследовать от базы.
Как мне рефакторировать код, чтобы удалить дублирование кода в ООП-манере?

Что я уже пробовал:

Я не хочу, чтобы функция имела общий код, а затем из der1 и der2 вызывала его. Это будет невозможно, если я не отправлю ему все защищенные переменные базы в качестве аргумента. Мне не очень понравился такой подход.
Итак, ищем ООП-подход для решения этой проблемы,

Rick York

- Это будет невозможно, если я не пошлю ему в качестве аргумента все защищенные переменные базы." Это неправда. Если вы делаете так, как предлагает Мистер Грифф, Intermediate предоставляет реализацию по умолчанию, и ничто другое не должно реализовывать func1 и func2, если вы не хотите отличающегося поведения. Кроме того, Intermediate будет иметь доступ ко всем открытым и защищенным членам и методам базы.

1 Ответов

Рейтинг:
4

OriginalGriff

Выведите третий класс из базы, который обрабатывает "общую" реализацию:

class Intermediate: public Base
   {
   ...
   }
Затем выведите свои классы из этого:
class der1: public Intermediate
   { 
   ...
   };

class der2: public Intermediate
   {
   ...
   }


_PitrakSarkar_

проблема с этим решением, как мне кажется, заключается в том, что теперь intermediate должен реализовать чистые виртуальные функции Base, и снова der1 и der2 также должны реализовать то же самое. Есть ли лучший способ?

OriginalGriff

Нет, Intermediate предоставляет конкретные реализации, которые наследуются der1 и der2