nói một cách lỏng lẻo, Nguyên tắc thay thế Liskov nói rằng một lớp dẫn xuất có thể được thay thế thay cho lớp cơ sở mà không ảnh hưởng đến người dùng. Trong trường hợp lớp cơ sở là một lớp trừu tượng, có nghĩa là không có người dùng nào đang sử dụng một cá thể của lớp cơ sở, thì các hạn chế thừa kế Liskov vẫn áp dụng cho lớp dẫn xuất?Nguyên tắc thay thế Liskov có áp dụng cho loại phụ được kế thừa từ lớp trừu tượng không?
Trả lời
Chỉ vì bạn không thể nhanh chóng một lớp học đặc biệt không có nghĩa là bạn không thể sử dụng nó. Trong trường hợp này, mã gọi đang sử dụng lớp cơ sở trừu tượng như định nghĩa của hợp đồng mà nó hoạt động. Theo nghĩa đó, mọi lớp có nguồn gốc từ lớp cơ sở nên có thể hoán đổi cho nhau đối với giao diện được định nghĩa bởi lớp cơ sở, vì vậy có Liskov vẫn áp dụng. Thực tế, đây là một lý do chính tại sao bạn muốn có một lớp cơ sở trừu tượng cho một tập hợp các lớp có một số hành vi chung - vì vậy bạn có thể định nghĩa các hoạt động theo giao diện lớp cơ sở và không quan tâm đến lớp dẫn xuất nào bạn đang thực sự hoạt động.
Vâng, bởi vì một người gọi luôn có thể làm điều này:
BaseAbstractClass instance = new DerivedClass();
Lớp trừu tượng không xung đột với LSP. Nhiều người cho rằng việc sử dụng "mới" trực tiếp từ mã máy khách là vi phạm tinh thần của LSP. Nếu cả hai bạn khởi tạo và sử dụng một đối tượng, bạn sẽ bị ràng buộc chặt chẽ với việc thực thi đó, và bạn không thể "thay thế" nó chút nào.
Xem xét việc tạo đối tượng được tạo thông qua một nhà máy hoặc được thông qua dưới dạng đối số hoặc thông qua tiêm phụ thuộc sau khi được tạo bởi một loại kho lưu trữ nào đó có thể tập trung vào việc đưa ra quyết định về loại cụ thể nào trong các trường hợp khác nhau.
Tóm lại, có. LSP áp dụng cho cơ bản tất cả thừa kế công khai. Thực tế là một lớp cơ sở là trừu tượng không thay đổi điều đó. Lớp cơ sở định nghĩa một giao diện và tất cả các dẫn xuất hợp pháp phải đáp ứng tất cả các yêu cầu của giao diện đó.
Có.
Xem phần "Ví dụ thực tế" (trang 7-8) của Uncle Bob's The Liskov Substitution Principle article.
- 1. Các lớp học kế thừa từ lớp trừu tượng
- 2. Lớp trừu tượng được thừa kế với JPA (+ Hibernate)
- 3. Làm cách nào để tránh vi phạm Nguyên tắc Thay thế Liskov (LSP)?
- 4. Liskov thay nguyên tắc - phương pháp trọng dụ
- 5. Quy tắc cho kế thừa lớp
- 6. C# lớp trừu tượng kế thừa trường tĩnh
- 7. java lớp con: nhiều nhà xây dựng được kế thừa từ lớp cha trừu tượng
- 8. dapper PropInfo Setter cho EntitySet kế thừa từ tham chiếu lớp trừu tượng là null
- 9. Lớp trừu tượng bắt nguồn từ lớp không trừu tượng
- 10. Lớp trừu tượng kế thừa loại có nguồn gốc cao nhất
- 11. Một lớp không trừu tượng có thể được mở rộng (được kế thừa từ) trong Java không?
- 12. Quy tắc thừa kế Spring @Transactional
- 13. Kiểm thử đơn vị một lớp kế thừa từ lớp trừu tượng
- 14. Phải triển khai phương pháp trừu tượng được thừa kế
- 15. một lớp trừu tượng được thừa hưởng một vấn đề khác lớp trừu tượng
- 16. Nguyên tắc phân tách quyền thừa kế và giao diện
- 17. Sqlalchemy: tránh nhiều thừa kế và có lớp cơ sở trừu tượng
- 18. "Nghịch đảo phụ thuộc" và "Thiết kế giao diện" có cùng nguyên tắc không?
- 19. Không thể sử dụng lớp Meta của mô hình Django kế thừa để định cấu hình trường được xác định trong mô hình trừu tượng được thừa kế
- 20. Tại sao Java cho phép đa kế thừa từ giao diện nhưng không phải từ lớp trừu tượng/bê tông
- 21. Tôi có thể áp dụng thuộc tính cho thành viên được kế thừa không?
- 22. quá tải kế thừa phương pháp trừu tượng
- 23. Thừa kế lớp bảng giáo lý khi một lớp con không có thuộc tính phụ
- 24. Thay đổi Loại thuộc tính kế thừa (thành kiểu được kế thừa)
- 25. Nguyên tắc hướng đối tượng có nên được áp dụng trong các ngôn ngữ thủ tục không?
- 26. thay thế thừa kế đa cấp
- 27. Loại trừu tượng Scala đại diện cho loại phân lớp
- 28. Làm cách nào để áp dụng việc tiêm phụ thuộc vào một nhà máy trừu tượng
- 29. tại sao kế thừa từ đối tượng loại
- 30. Có [Serializable] hoạt động cho các lớp được kế thừa không?