Скорее всего, вы действительно хотите составить или объединить (см. здесь для шаблона проектирования ). Может быть, вы определяете поведение. Вы всегда можете реализовать интерфейс SomeInterface в базовом классе, иметь член типа SomeInterface (что позволяет ему быть любым классом, который реализует SomeInterface и, следовательно, может иметь код, реализующий), в конструкторе members передается ссылка на базовый класс. который владеет им при необходимости (при этом попробуйте добавить другой интерфейс для определения обратных вызовов, базовый класс будет реализовывать его, а подкласс будет иметь его как тип переменной-члена). Используйте вызовы к классу-члену для реализации SomeInterface. Таким образом, код реализован в другом классе, что упрощает поддержку, но вы не выполняете множественное наследование.
Идея, лежащая в основе композиции, заключается в том, что двигатель - это не автомобиль, а автомобиль с двигателем. Автомобиль нуждается в двигателе, но ему не нужно знать, как работает весь двигатель, как взаимодействовать с ним. Поэтому двигатель не должен наследовать от автомобиля. Но иметь машину, внедряющую двигатель, глупо. Таким образом, автомобиль получает двигатель как элемент всей машины, но как объект. Автомобиль имеет в своем составе двигатель.
Похоже, то, что вы делаете, больше похоже на поведение, как на объект утки, который ведет себя шарлатански, но резиновые утки - это утки, но они не крякают, а скрипят. Таким образом, они отличаются от крякв, но оба имеют много общих черт. Итак, вы хотите иметь шарлатанский интерфейс, который каждый реализует по-своему. Но многие утки будут крякать для этого интерфейса, поэтому вам не нужно писать кряк для каждого. Вот где вы используете композицию для реализации интерфейса поведения кряка.