Композиция с помощью наследования - это вещь в языках, которые ее поддерживают, но это считается практикой, не соответствующей стандартам, или даже композицией против шаблона в ООП.
С наследованием вы получаете автоматическую реализацию метода и преобразования. Но вы отказываетесь от контроля над API. И вы вводите связь между S1
и S2
, потому что их реализация ограничивает друг друга, они не могут называть своих членов одинаковыми, не вводя двусмысленности. ИМХО, здесь больше ловушек из-за большей неявности, идущей таким образом.
С композицией вы сохраняете гибкость и точный контроль зерна за счет явного косвенного обращения ... и усилий по внедрению, которые сопровождают это. По сути, оба API должны быть скопированы, если это необходимо, и, похоже, в вашем случае.
В других аспектах они практически одинаковы, вы можете написать код, который будет иметь такое же удобство использования в зависимости от клиента. Например. преобразования и назначения.
Вам не нужны копии в любом случае. Для наследования вы можете предоставить make_C
средство и переслать аргументы c'or. S1
и S2
должны обеспечивать любой способ построения, который вы можете использовать повторно, что верно для обоих подходов. Вы должны быть в состоянии написать соответствующие c'tors для шаблона наследования.
Если вам нужно отделить C
от его составляющих, вам нужно каким-то образом сделать копии в композиции и через членство.
Вы не можете сделать C
фасадом вокруг ссылки, используя наследование, как вы могли бы с составом членства, используя ссылку на компоненты. Но если вам нужно разделить идентичность между экземпляром C
и его соответствующими частями, то это не настоящее композиционное отношение.
В общем, сказать, что головной боли будет меньше, невозможно, это дизайнерское решение. Более общим и гибким является состав с учетом членства, более простое, вероятно, наследование. Но я не уверен, смогу ли я его обменять.
Я бы сказал, что чем более закрыт и окостеневший дизайн, и вы уверены, что никакое наследование помех не будет более безопасным для его профессионалов. В противном случае, это может быть PIA и необходимость рефакторинга в какой-то момент времени. Если у вас огромные классы, повторяющиеся интерфейсы будут PIA.