Khi bạn sử dụng khái niệm đa hình, bạn tạo một hệ thống phân cấp lớp và sử dụng tham chiếu cha mẹ, bạn gọi các hàm giao diện mà không biết loại cụ thể nào có đối tượng. Điều đó thật tuyệt. Thí dụ:
Bạn có bộ sưu tập động vật và bạn kêu gọi tất cả các động vật hoạt động eat
và bạn không quan tâm nếu đó là một con chó đang ăn hay một con mèo. Nhưng trong hệ thống phân cấp lớp cùng bạn có động vật có bổ sung - khác hơn là kế thừa và thực hiện từ lớp Animal
, ví dụ makeEggs
, getBackFromTheFreezedState
và vân vân. Vì vậy, trong một số trường hợp trong chức năng của bạn, bạn có thể muốn biết loại cụ thể để gọi các hành vi bổ sung.
Ví dụ, trong trường hợp đó là thời gian buổi sáng và nếu đó chỉ là một con vật thì bạn gọi eat
, nếu không thì đó là con người, sau đó gọi trước washHands
, getDressed
và sau đó gọi eat
. Làm thế nào để xử lý trường hợp này? Đa hình chết. Bạn cần tìm ra loại đối tượng, nghe có vẻ như mùi mã. Có một cách tiếp cận phổ biến để xử lý trường hợp này?
Eater
giao diện với eat()
phương thức, thì với tư cách là một máy khách, bạn không quan tâm rằng Human
việc triển khai nó phải gọi đầu tiên washHands()
và getDressed()
, đó là một chi tiết triển khai của lớp này. Nếu, với tư cách là một khách hàng, bạn quan tâm đến thực tế này, thì rất có thể bạn không sử dụng đúng công cụ cho công việc.
getDressed
trước họ eat
, đó không phải là trường hợp cho bữa trưa. Tùy thuộc vào hoàn cảnh của bạn, washHands();if !dressed then getDressed();[code to actually eat]
có thể là cách tốt nhất để thực hiện điều này cho một con người. Một khả năng khác là nếu những thứ khác yêu cầu điều đó washHands
và / hoặc getDressed
được gọi thì sao? Giả sử bạn có leaveForWork
? Bạn có thể cần cấu trúc luồng chương trình của mình để nó được gọi là lâu trước đó.