Я думаю, что, с моей точки зрения, он ломается в случае добавления новых методов в базовый или суперкласс.Если A
является подклассом B
, даже если A
не изменяется каким-либо образом, изменение в B
может нарушить A
.(Это называется эффектом Ripple)
Пример: предположим, что A
переопределяет все методы в B
, сначала проверяя входные аргументы в каждом методе ( по соображениям безопасности ).Если к B
добавлен новый метод, а A
не обновлен, новый унаследованный метод создаст дыру в безопасности.
Чтобы избавиться от ловушек в наследовании, используйте или используйте «Композицию» вместоНаследование, простая агрегация вместо наследования, ниже приведен пример:
Представьте себе два класса, Person
и Employee
.Вместо того, чтобы просить Employee
наследовать от Person
, вы можете составить Person
внутри Employee
и направить запросы на функциональность Person
составному классу. Таким образом, мы все еще получаем преимущество от повторного использования Person
класса.1026 *
Примечания:
Person
класс может быть абстрактным классом ИЛИ
Person
классможет быть protected
внутри того же пакета, что и Employee