Есть две школы мысли о том, как лучше всего расширить, расширить и повторно использовать код в объектно-ориентированной системе:
-
Наследование: расширение функциональности класса путем создания подкласса. Переопределите элементы суперкласса в подклассах, чтобы обеспечить новые функциональные возможности. Сделать методы абстрактными/виртуальными, чтобы заставить подклассы "заполнять пробелы", когда суперкласс хочет определенного интерфейса, но агностик в его реализации.
-
Агрегация: создайте новую функциональность, взяв другие классы и объединив их в новый класс. Прикрепите общий интерфейс к этому новому классу для взаимодействия с другим кодом.
Каковы преимущества, затраты и последствия каждого из них? Существуют ли другие альтернативы?
Я вижу, что эти дебаты возникают на регулярной основе, но я не думаю, что это было задано Переполнение стека еще (хотя есть некоторые связанные обсуждения). Там также неожиданное отсутствие хороших результатов Google для него.