А не имеет ли смысл рассматривать наследование в первую очередь как subtyping? То есть в переменную типа A мы при этом можем поместить значение любого типа-наследника. Имея subtyping и инкапсуляцию, нам неизбежно придётся «использовать по умолчанию поля и методы своего предка». А поскольку преемственность полей и методов следует из subtyping и инкапсуляции, то использовать эту преемственность для определения наследования немного странно. Таким образом получаем, что наследование это по определению subtyping, а преемственность методов при наследовании — механизм обусловленный наличием subtyping и инкапсуляции в языке.
Применяя это рассуждение к теме статьи можно сформулировать следующие рекомендации по вопросу composition vs inheritance:
— если инстансы класса B необходимо хранить в переменных типа A, то B должен быть наследником (подтипом), прямым или опосредованным, класса A;
— если в первом нет необходимости, имеет смысл проектировать код используя композицию.
Как думаете, насколько полезен был бы такой подход при написании сопровождаемого кода?
Применяя это рассуждение к теме статьи можно сформулировать следующие рекомендации по вопросу composition vs inheritance:
— если инстансы класса B необходимо хранить в переменных типа A, то B должен быть наследником (подтипом), прямым или опосредованным, класса A;
— если в первом нет необходимости, имеет смысл проектировать код используя композицию.
Как думаете, насколько полезен был бы такой подход при написании сопровождаемого кода?