Говоря свободно, Лисков Замена Принцип утверждает, что производный класс может быть заменен вместо базового класса, не затрагивая пользователя. В случае, когда базовый класс является абстрактным классом, а это означает, что пользователь не использует экземпляр базового класса, применяются ли ограничения наследования Лискова к производному классу?Применяется ли принцип замены Лискова для подтипа, который унаследован от абстрактного класса?
ответ
Просто потому, что вы не можете создать экземпляр определенного класса не означает, что вы не можете использовать его. В этом случае вызывающий код использует абстрактный базовый класс в качестве определения контракта, в котором он работает. В этом смысле каждый класс, который вытекает из базового класса, должен быть взаимозаменяемым по отношению к интерфейсу, определенному базовым классом, поэтому да Лисков все еще применяется. На самом деле, это одна из основных причин, почему вы хотели бы иметь абстрактный базовый класс для коллекции классов, которые имеют некоторое общее поведение - поэтому вы можете определять операции с точки зрения интерфейса базового класса и не заботиться о том, какой производный класс вы на самом деле работаете.
Да потому, что абонент всегда может это сделать:
BaseAbstractClass instance = new DerivedClass();
Абстрактные классы не конфликтуют с LSP. Многие считают, что использование «нового» непосредственно из клиентского кода является нарушением духа LSP. Если вы оба создаете экземпляр и используете объект, вы тесно привязаны к этой реализации, и вы не можете «заменить» его вообще.
Рассмотрите возможность создания объекта на заводе или переданного в качестве аргумента или путем инъекции зависимостей после создания каким-то репозиторием, который может быть сфокусирован на принятии решений о том, какие конкретные типы необходимы в различных обстоятельствах.
Короче говоря, да. LSP применяется к по существу всем общественному наследованию. Тот факт, что базовый класс является абстрактным, не меняет этого. Базовый класс определяет интерфейс, и все законные производные должны удовлетворять всем требованиям этого интерфейса.
Да.
См. Раздел «Реальный пример» (стр. 7-8) от Uncle Bob's The Liskov Substitution Principle article.
- 1. Принцип замены Лискова
- 2. Принцип замены Лискова - нет переопределяющих/виртуальных методов?
- 3. Принцип замены Лискова и несколько иерархий
- 4. Почему InflaterInputStream # available() нарушает принцип замены Лискова?
- 5. Принцип замены Лискова и обработка исключений
- 6. Принцип замены Лискова (LSP) нарушен через проект по контракту (DBC)?
- 7. Можно ли нарушить принцип замены Лискова в конструкторе?
- 8. Нарушение Принципа замены Лискова
- 9. Принцип замены Лискова также применим к классам, реализующим интерфейс?
- 10. Нельзя ли ослабить предпосылки и усилить постусловия, также нарушить Принцип замены Лискова?
- 11. Принцип общей подстановки - как применяется принцип принципа
- 12. Принцип наследования/интерфейса Java класса
- 13. Является ли это нарушением принципа замены Лискова?
- 14. Принцип замещения Лискова (книга дяди Боба)
- 15. Наследование от класса, который наследуется от абстрактного класса
- 16. Метод вызова Objective-C, который был унаследован от другого класса
- 17. Как эффективно делиться функциями между классами, не нарушая Принцип замены Лискова.
- 18. Конкретный класс наследуется от абстрактного класса, который наследуется от общего абстрактного класса
- 19. Наследование от абстрактного класса
- 20. Динамически создать экземпляр класса, который является производным от абстрактного класса
- 21. Liskov принцип подстановки дизайна адаптации
- 22. Scala унаследован от класса со статическими методами
- 23. Стиль CSS не унаследован от класса
- 24. Не могли бы вы объяснить принцип замены Лискова с хорошим примером C#?
- 25. Оператор + для подтипа класса шаблона
- 26. Отличие от абстрактного и не абстрактного класса
- 27. shared_ptr от unique_ptr абстрактного класса
- 28. Доктрина 2 - От абстрактного класса до абстрактного класса
- 29. Почему неизменные объекты позволяют соблюдать Принцип замещения Лискова?
- 30. Как создать поток для класса, который унаследован QWidget?