Trong hành trình viết mã tốt hơn, sạch hơn, tôi đang tìm hiểu về các nguyên tắc RẮN. Trong đó, LSP đang tỏ ra hơi khó nắm bắt đúng cách.
Sự nghi ngờ của tôi là điều gì xảy ra nếu tôi có một số phương thức bổ sung trong tiểu loại của tôi, S, không có trong loại, T, liệu điều này có luôn vi phạm LSP không? Nếu có, làm thế nào để extend
tôi lớp học của tôi?
Ví dụ: giả sử chúng ta có một Bird
loại. Và các kiểu con của nó là Eagle
và Humming Bird
. Bây giờ cả hai kiểu con có một số hành vi phổ biến là Bird
. Nhưng Eagle
cũng có hành vi săn mồi tốt (không có trong Bird
loại chung ), mà tôi muốn sử dụng . Do đó, bây giờ tôi sẽ không thể làm điều này:
Bird bird = new Eagle();
Vì vậy, việc đưa ra Eagle
những hành vi bổ sung phá vỡ LSP?
Nếu có, điều đó có nghĩa là tôi không thể mở rộng các lớp học vì điều đó sẽ gây ra vi phạm LSP?
class Eagle extends Bird {
//we are extending Bird since Eagle has some extra behavior also
}
Mở rộng các lớp nên được cho phép theo nguyên tắc Mở / Đóng phải không?
Cảm ơn bạn đã trả lời trước! Như bạn có thể thấy rõ, LSP khiến tôi bối rối như mọi thứ.
Chỉnh sửa: Tham khảo câu trả lời SO này. Trong trường hợp này một lần nữa, khi Car
có hành vi bổ sung như thế ChangeGear
, nó vi phạm LSP. Vậy, làm thế nào để chúng tôi mở rộng một lớp học mà không vi phạm LSP?