เมื่อคุณใช้แนวคิดของความหลากหลายที่คุณสร้างลำดับชั้นของชั้นเรียนและใช้การอ้างอิงผู้ปกครองที่คุณเรียกใช้ฟังก์ชั่นอินเทอร์เฟซโดยไม่ทราบว่าชนิดที่เฉพาะเจาะจงมีวัตถุ มันเยี่ยมมาก ตัวอย่าง:
คุณมีคอลเลคชั่นสัตว์และเรียกร้องให้สัตว์ทุกตัวทำงานeat
และคุณไม่สนใจว่ามันจะกินสุนัขหรือแมว แต่ในลำดับชั้นเดียวกับที่คุณมีสัตว์ที่มีเพิ่มเติม - อื่น ๆ กว่าสืบทอดและดำเนินการจากชั้นเรียนAnimal
เช่นmakeEggs
, getBackFromTheFreezedState
และอื่น ๆ ดังนั้นในบางกรณีในการทำงานของคุณคุณอาจต้องการทราบประเภทเฉพาะเพื่อเรียกใช้พฤติกรรมเพิ่มเติม
ยกตัวอย่างเช่นในกรณีที่มันเป็นช่วงเวลาเช้าและถ้ามันเป็นเพียงสัตว์แล้วคุณเรียกeat
มิฉะนั้นถ้ามันเป็นมนุษย์แล้วโทรครั้งแรกwashHands
, และเพียงแล้วโทรgetDressed
eat
วิธีจัดการกรณีนี้? ความแตกต่างตาย คุณจำเป็นต้องค้นหาประเภทของวัตถุซึ่งฟังดูมีกลิ่นรหัส มีวิธีการทั่วไปในการจัดการกรณีนี้หรือไม่?
Eater
อินเทอร์เฟซด้วยeat()
วิธีการในฐานะลูกค้าคุณไม่สนใจว่าการHuman
ติดตั้งจะต้องมีการโทรครั้งแรกwashHands()
และgetDressed()
เป็นรายละเอียดการใช้งานของคลาสนี้ หากในฐานะลูกค้าคุณให้ความสำคัญกับความจริงข้อนี้คุณอาจไม่ได้ใช้เครื่องมือที่ถูกต้องสำหรับงาน
getDressed
ก่อนeat
ไม่ใช่อาหารกลางวัน ขึ้นอยู่กับสถานการณ์ของคุณwashHands();if !dressed then getDressed();[code to actually eat]
อาจเป็นวิธีที่ดีที่สุดในการดำเนินการนี้สำหรับมนุษย์ ความเป็นไปได้อีกอย่างคือจะเกิดอะไรขึ้นถ้าสิ่งอื่น ๆ ต้องการwashHands
และ / หรือgetDressed
ถูกเรียก? สมมติว่าคุณมีleaveForWork
? คุณอาจจำเป็นต้องจัดโครงสร้างโฟลว์โปรแกรมของคุณเพื่อให้มันเรียกใช้มานานแล้ว