Допустим, у меня есть следующий унаследованный код, что у меня есть возможность улучшить:Лучшая практика для определения интерфейса времени компиляции
class BaseInterfaceClass
{
#if(HAS_FEATURE_A == 1)
void doFeatureA1() = 0;
void doFeatureA2() = 0;
#endif
#if(HAS_FEATURE_B == 1)
void doFeatureB1() = 0;
void doFeatureB2() = 0;
void doFeatureB3() = 0;
#endif
#if(HAS_FEATURE_C == 1)
void doFeatureC1() = 0;
#endif
void doBaseFeature1() = 0;
void doBaseFeature2() = 0;
};
Есть ли способ, чтобы покончить с #ifdef
методом определения интерфейса при компиляции без увеличения времени выполнения нового дизайна? Другими словами, мне нужно сохранить тот факт, что производный класс, который компилируется только с HAS_FEATURE_A
, не будет содержать код для HAS_FEATURE_B
или HAS_FEATURE_C
(по сравнению с кодом, связанным, просто не используемым из-за проверки времени выполнения).
Несколько замечаний
Комфортные флаги не являются взаимоисключающими. Любая комбинация из них может быть определена.
Как я понимаю, определение подкласса для каждой функции, а затем использование множественного наследования для объединения желаемых интерфейсов недостаточно. Помните, что производный класс должен иметь возможность реализовать любую комбинацию функций во время компиляции и не включать функцию, которая не определена для этой компиляции.
Политическая стоимость изменения кода означает, что я должен быть в состоянии избавиться от всех директив или вообще не делать этого. Другими словами, недостаточно просто переместить определения
#ifdef
, чтобы сделать базовый класс более красивым.Существует достаточно сочетаний функций, которые могут быть нереалистичными. Я не собираюсь делать тысячи подклассов.
Я не знаю шаблонов, но я хочу узнать, является ли это ключом.
Почему нет множественного наследования? Это решило бы проблему очень элегантно. – Xeo
Я вижу, что ломается так много неприятных способов, что не все они постыдные. –