Как реализовать расширяемость модулей с использованием интерфейсов?
Пишу софтину, которая считывает пакеты данных с серийного порта, обрабатывает их и кидает в очередь. Затем вынимает и отправляет по сети куда-то ещё.
Соответственно, в моём понимании как минимум должен быть модуль, который кидает в очередь обработанные сообщения, и модуль, который их оттуда забирает. И здесь я столкнулся с проблемой:
- Обработанное сообщение содержит больше полей, чем мне требуется для отправки. К примеру, время, айдишник, сама информация сообщения и т.д. Мне же в данный момент требуется только информация. Отсечь лишнее не могу, т.к. оно потом понадобится для другого модуля.
- Из того что я читал(solid?), каждый класс должен выполнять строго определённую функцию, поэтому с архитектурной точки зрения через один и тот же интерфейс лучше не стоит и формировать сообщение, и иметь доступ ко всем его полям в другом модуле, которому нужно что-то конкретное.
Вот и возникает вопрос, как спланировать архитектуру классов так, чтобы оставалась возможность их расширения? На ум приходит множественное(ромбовидное?) наследование, что также считается плохой практикой...
Я абсолютно уверен, что описанный случай был уже множество раз разобран, но не представляю, как адекватно сформулировать запрос в гугл, поэтому прошу совета здесь.
Я бы в такой задаче попробовал сделать архитектуру, основываясь на виртуальных базовых классах - т.е. множественном наследовании, при котором многократно наследуемый класс везде, где он возникает, определяется как виртуальный базовый. Как известно, если класс (напрямую или через своих предков) многкратно наследует некий класс как виртуальный, то при содании экземпляра такого класса создается только один экземплярэтого базового класса.
В частности, с помощью виртуального абстрактного базового класса, содержащего только чистые виртуальные методы, вполне можно сделать аналог интерфейсов, существующих в других языках: Java, C# и пр. - и пользоваться в C++ архитектурными наработками, сделанными с использованием интерфейсов.