Polymorphism

Polymorphism

ในห้องสัมภาษณ์ ผมขอให้ candidate อธิบายเรื่องชอง Polymorphism แต่ว่าเขาตอบไม่ได้ ผมยึงให้คำใบ้เขาไปคำนึง โดยการหยิบดินสอออกมาสองแท่ง ตามรูปข้างต้น

ลองเอาคำพูดที่ว่า “ดินสอสองแท่ง” กับภาพข้างต้นมาประกอบกัน แล้วลองอธิบายดูนะครับว่า Polymorphism คืออะไร ถ้าตอบได้ก็แสดงว่าเข้าใจละ ถ้าไม่ได้ก็ลองอ่านต่อนะครับ

นึกไม่ออกเหรอครับ ? ลองอ่านต่อนะครับ

Polymorphism

คำว่า Polymorphism เป็นลักษณะเฉพาะอย่างหนึ่งของ OOP ที่วัตถุประเภทเดียวกันอาจจะมีคุณลักษณะ หรือมีพฤติกรรมที่แตกต่างกันได้ครับ อย่างในกรณีนี้ผมหยิบดินสอมาสองแท่ง

  • แท่งหนึ่งเป็นดินสอไม้ เป็นด้ามไม้ มีไส้เป็นแท่งกราไฟท์ขนาดใหญ่ เวลาจะเขียนต้องเหลาก่อน เขียนแล้วมันจะค่อย ๆ สั้นลง พอหมดแล้วเติมไส้ไม่ได้ต้องเปลี่ยน
  • อีกแท่งหนึ่งเป็นดินสอกด ด้ามเป็นพลาสติก ข้างในมีไส้กราไฟท์ขนาดเล็ก เป็นแท่งสั้น ๆ จำนวนหนึ่ง ก่อนจะเขียนต้องกดให้ไส้มันไหลลงมา (หรือจะสอดจากด้านหัวก็ได้)

แต่ทั้งสองแท่งก็เป็นดินสอเหมือนกัน และใช้แทนกันได้ครับ อันนี้เป็น poylymorphism ที่เกิดจากการสืบทอด (inheritance) ซึ่งก็เป็นวิธีที่ง่ายที่สุดและนิยมที่สุด แต่จริง ๆ ก็มีอีกหลายวิธี เช่นอาจจะเป็นการ inject คลาสที่แสดงออกทางพฤติกรรมเข้าไปแทน

Usage

ในทาง OOP แล้ว Polymorphism เป็นหนึ่งในคุณสมบัติที่ใช้กันอย่างแพร่หลาย คือเรียกได้ว่าถ้าใช้ไม่เป็นก็ไม่ควรเรียกตัวเองว่าเป็นโปรแกรมเมอร์สาย OO ตัวมันเองก็เป็นหนึ่งในคุณสมบัติหลักของ OOP (ที่เรียกว่า “เสาสี่ต้นของ OOP” คุณสมบัติอื่นคือ Inheritance, Instantiation, Encapsulation)

สมมติว่าเรามีคลาส shape และเราต้องการที่จะวาดมันลงไปใน paper โดยเราต้องมี pencil ในการวาด เราก็อาจจะเขียนแบบนี้

Shape c = new Circle(5);
Pencil p = new WoodenPencil(PencilHardness::2B);
getPaper.draw(c, p, new Point(50, 100));

ก็จะได้ภาพออกมาแบบนึง

มาวันนึงเราอยากได้เส้นเล็ก ๆ คม ๆ แบบดินสอกดมากกว่า ก็แค่เปลี่ยนเป็น

Shape c = new Circle(5);
Pencil p = new MechanicalPencil(PencilHardness::2B);
getPaper.draw(c, p, new Point(50, 100));

แค่นี้เอง ผลลัพท์ก็อาจจะเปลี่ยนไปตามลักษณะของดินสอที่ใช้ (ถ้ามันเหมือนกันเราคงไม่มีหลายคลาสครับ) แต่ก็ใช้งานได้เหมือนกัน ได้ภาพวงกลมบนกระดาษเหมือนกัน