OOP

Polymorphism – ผ่าเหล่าผ่ากอ

ทบทวนกันก่อนเรื่อง Inherited ของ OOP โดย inherited มีประโยชน์ในการ reuse code คือมี code ต้นทางชุดเดียว แล้วสืบทอดมาที่คลาสของเรา ทำให้เราสามารถใช้ Data และ Method ของคลาสต้นทางได้

ทีนี้ถ้าเกิดว่า ถ้าเกิดเราไม่อยากให้ Method ที่สืบทอดมาทำงานเหมือนกับต้นแบบ การ inherited เพียงอย่างเดียวก็ไม่ตอบโจทย์เสียแล้ว

ดังนั้นจึงต้องใช้อีกความสามารถนึงของแนวคิดแบบ OOP คือ การทำ Polymorphism แปลๆกันมาว่าการมีหลายรูปแบบ แต่ผมขอเรียกแบบบ้านๆว่า การผ่าเหล่าผ่ากอ คือทำได้ไม่เหมือนวงศ์สาคณาญาติ (อาจจะดีกว่าหรือแย่กว่าก็ได้นะ)

ยกตัวอย่างให้เห็นภาพ สมมติ เราจะสร้างเกมล่าสัตว์ในอุทยานแห่งชาติ

อันดับแรก สมมติเราออกแบบให้มีคลาสหลักคือ Class GameObject โดย Gameobject  จะมีความสามารถในการเคลื่อนที่ ดังนั้น เราจะออกแบบคลาสนี้ให้มี Method ชื่อ Move

ต่อมาเราจะสร้าง Class ตัวละครในเกม 3 คลาส ได้แก่ เสือดำ(Panther), นายพราน(Hunter), ลูกปืน(Bullet) โดยทั้งสามคลาส สืบทอดมาจาก Class GameObject

ทั้งสามคลาสก็จะมี Method Move ที่สามารถใช้งานได้

ตัวอย่างการเรียกใช้

Panther.move()

Hunter.move()

Bullet.move()

แต่ว่าตัวละครทั้งสามในเกม มันเคลื่อนที่ไม่เหมือนกันน่ะสิ การเคลื่อนที่ของเสือดำ จะปราดเปรียวว่องไว ส่วนนายพรานอาจจะอ้วนเลยเคลื่อนที่ช้าหน่อย ส่วนการยิงปืนไปโดนเสือ ลูกปืน ก็มีการเคลื่อนที่เส้นตรงอย่างรวดเร็วที่สุด

ดังนั้นแต่ละตัวละคร มันมีการเคลื่อนที่ทำงานไม่เหมือนกัน การ inherited มาเพียงอย่างเดียว เลยยังไม่ตอบโจทย์ เพราะถ้าไม่ทำอะไรเพิ่ม การเคลื่อนที่ของทั้งสามก็จะเหมือนกัน คือใช้วิธีการเคลื่อนที่ตาม class ต้นทาง คือ GameObject.move()

ถ้าจะตอบโจทย์เราก็ต้องเอาความสามารถ Polymorphism เข้ามาช่วย

โดย Polymorphism พูดง่ายๆก็คือเราสามารถที่จะทำให้ Method ชื่อ Move ของแต่ละตัวละคร ทำงานต่างกันได้ โดยเขียน code ในแต่ละ class ตัวละคร ให้มันต่างกัน เราเรียกการทำแบบนี้ว่า Method overriding

ยกตัวอย่างเช่น

ในคลาส GameObject เราเขียน code ไว้ใน Method move ว่า เคลื่อนที่ได้ 10 km/hr

ทีนี้ในแต่ละคลาสตัวละคร ที่สืบทอดมา เราไม่ได้ต้องการให้เคลื่อนที่ได้ 10 km/hr ทุกตัว ดังนั้นเราต้องทำ Method overriding คือไม่ใช้ code จาก method move ของต้นแบบ แต่จะเขียนเอาเอง

ถ้าเป็นคลาสเสือดำ เราก็อาจจะเขียน Code ใน method move ของคลาสเสือดำ ว่า วิ่งได้ 50 km/hr แต่ถ้าเป็นนายพราน เราก็อาจจะเขียน code ใน method move ของคลาสนายพรานว่า ไม่ต้องเดิน นั่งเฉยๆ ก็ได้กินซุปเสือดำแล้ว

 

 

You may also like