Существует общее правило проектирования OO, которое вы должны моделировать: отношения, использующие наследование, и имеющие отношения с использованием сдерживания/агрегации и пересылки/делегирования. Это еще более сузилось из предостережения от GoF, что вы, как правило, предпочитаете сдерживание над наследованием, предлагая, возможно, чтобы, если бы вы могли сделать убедительный аргумент для одного в конкретной ситуации, это сдерживание обычно должно получить одобрение из-за обслуживания Иногда может наследоваться проблемы.
Я понимаю причины этого мышления, и я не согласен с этим. Однако, когда я вижу класс с множеством методов, каждый из которых просто пересылает некоторую переменную экземпляра, я вижу форму дублирования кода. Кодирование дублирования, на мой взгляд, является окончательным запахом кода. Повторное выполнение огромного протокола методов только потому, что связь между двумя классами не является строго-а, похоже, излишним. Это дополнительный, ненужный код, добавленный в систему, код, который теперь нуждается в проверке и документировании, как и любая другая часть системы, - код, который вам, вероятно, не пришлось бы писать, если вы просто унаследовали.
Издержки, связанные с соблюдением этого принципа сдерживания над наследством, перевешивают его преимущества?