С++:Как избежать двойного обслуживания в иерархиях наследования

StackOverflow https://stackoverflow.com/questions/2359019

  •  23-09-2019
  •  | 
  •  

Вопрос

При создании структуры наследования C++ вам необходимо определить одинаковые функции-члены в нескольких местах:

Если B — абстрактный базовый класс, а D, E и F наследуют от B, у вас может быть следующее:

class B
{
   virtual func A( ... params ) = 0;
};

class D : public B
{
   func A( ... params );
};

/* ... etc... similar implementations for E and F */

Так что здесь явно есть некоторое дублирование.Если интерфейс B большой, у вас может быть много мест, которые можно изменить, если интерфейс необходимо изменить.

Коллега предложил хитрость со встроенным искусно созданным #includes, аля:

class D: public B
{
   #include "B_Interface.h"  // B_Interface.h is a specially crafted .h file
}

Это кажется немного неуклюжим?Это?Есть ли лучшее решение, позволяющее избежать двойного обслуживания?

Кроме того, может быть, решением здесь действительно являются лучшие инструменты для поддержки языка, такие как Visual Assist X?

Редактировать:Предположим, что производные классы должны иметь уникальные реализации.

Это было полезно?

Решение

На самом деле, самая большая проблема при изменении интерфейса — это весь код, который использует это, а не код, который его реализует.Если разработчику будет легко изменить его, это, вероятно, усложнит жизнь пользователям.

Другие советы

То, что менять широко используемый интерфейс болезненно, не является ошибкой;это особенность.

Кроме того, может быть, решением здесь действительно являются лучшие инструменты для поддержки языка, такие как Visual Assist X?

Точно.Изменение сигнатур методов — это Ключевой особенностью инструментов рефакторинга.

Если вам приходится реализовывать их снова и снова с каким-то поведением по умолчанию, возможно, они должны быть просто виртуальными, а не чисто виртуальными.

Вместо того, чтобы использовать препроцессор для еще одного способа, которым его не следует использовать, я бы попробовал свой редактор (или IDE, если вам это нравится).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top