С++:Как избежать двойного обслуживания в иерархиях наследования
-
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, если вам это нравится).