2010-02-12 26 views
10

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

5

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.

1

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(); 
0

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.

0

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ác vấn đề liên quan