Здравствуйте, Stgl, Вы писали:
S>Есть класс A() в программе foo и класс B() в программе bar. Сейчас классы — это просто обертка над кучей функций. Часть данных у этих двух классов совпадают, но есть и отличия. Аналогично с функциями — часть полностью одинакова, часть выполняют похожие действия с некоторыми отличиями. Хочу написать единую программу, так как действия обоих классов схожи и было бы логично иметь все в одном месте и для последующей поддержки будет проще менять что-то в коде одной программы.
Если это обёртка над кучей функций, то было бы естественно выделить библиотечный базовый класс, который неизменен — не зависит от целей приложения.
После чего в каждом приложении выполнять настройку этой базы.
Настройку можно выполнять несколькими способами, по вкусу:
— наследники являются обёртками над обёрткой, т.е. это не ООП-наследование, а, скорее, паттерн Адаптер
— у базы есть точки кастомизации в виде виртуальных методов, наследники их переопределяют
— ... в виде членов-данных, возможно, функциональной природы (колбеки, указатели на интерфейсы и т.п.), — наследники снабжают базовый объект своими Стратегиями
— ... в виде параметров шаблона (база — шаблон класса), наследники указывают эти параметры, вплоть до использования идиомы CRTP
// У этой функции есть небольшие отличия от аналогичной в классе B
void calc_2()
Специально для этого есть паттерн Шаблонный Метод, суть которого в том, чтобы
void calc_2() { calc2_1(); calc2_2(); ..... } // общий план работ одинаковый, но
virtual void calc2_1(); // детали (пере)определяются в наследниках
virtual void calc2_2();
....
Если поведение варьируется только от программы к программе, т.е. в одной программе не могут сосуществовать оба класса,
то можно даже без шаблонов, — выполнить декомпозицию: вынести уникальные части во внешние классы и функции, и в разных программах определить их по-разному.
Фактически, это получается условная компиляция.