Polymorphism #1 : The Idea

    ถ้าจะบอกว่า Implementation Inheritance นั้น programmer ทั่วไปประเมินค่าของมันสูงไปก็คงไม่ผิดนัก แต่ถ้าจะพูดอย่างนั้นประโยคที่ว่า Polymorphism นั้น programmer ทั่วไปแทบมองไม่เห็นค่าของมันเลยก็ไม่น่าจะผิด ทั้งนี้เป็นเพราะแรงโฆษณาของ Implementation Inheritance มันมีมาก มันเห็นภาพง่ายนั่นเอง มันจึงเป็นสัญลักษณ์ ของ OOP ไปโดยปริยาย  ซึ่ง Polymorphism นั้นมันไม่โชคดีขนาดนั้น แนวคิดมันกลับหัวทำให้ programmer เข้าใจยาก ดังนั้น Polymorphism จึงมักจะถูกมองข้าม วันนี้ถือเป็นโอกาสดี ที่ผมจะแนะนำให้ทุกคนรู้จัก Polymorphism แท้ๆ ซะที

    หลักการของ Polymorphism นั้นเป็นหลักการที่เติมเต็มความสามารถของ Inheritance ในเรื่องของการ Re-use code เนื้อหามันค่อนข้างยุ่ง ผมเลยคิดว่าบทนี้เราอย่าเพิ่งไปดู Syntax กันเลย เรามาคุยกันเรื่องแนวคิดของมันกันก่อนดีกว่า

    มาแตกคำกันก่อน poly- เป็น prefix ที่มีความหมายว่าหลายเช่น poly-clinic ก็คือจำพวกรักษาได้สารพัดโรค (มักเปิด 24 ชั่วโมง) หรือโรงเรียนจำพวก poly-technic แบบนี้ก็สอนช่างสารพัด ส่วนคำว่า morph ถ้าผมจำไม่ผิดมันน่าจะเป็นภาษากรีก มีความหมายว่ารูปแบบ เมื่อจับมารวมกันก็คงได้ทำนองว่า มันคือสิ่งเดียวกันที่มีหลายรูปแบบ ซึ่งศัพท์คำนี้ทางคอมพิวเตอร์ก็ยืมมาจากศัพท์ทางชีววิทยา ซึ่งมีความหมายว่า เป็นสิ่งมีชีวิตที่มี species เดียวกัน แต่รูปแบบต่างกัน 

    กุญแจสำคัญของเรื่องนี้มันอยู่ที่มันคือสิ่งเดียวกัน แค่มันต่างรูปแบบไปนั่นเอง ยึดสิ่งนี้ไว้ให้ดี

     ผมมีความเชื่อส่วนตัวว่า แนวคิดอะไรก็ตาม มันไม่ได้ลอยมากับลม การที่คิดหลักการอะไรขึ้นมา มันต้องมีที่มาที่ไป และที่มานี้ส่วนมากมันก็เป็นเรื่องธรรมชาติที่เกิดขึ้นแวดล้อมผู้คิดค้นนั่นเอง ในเรื่อง Polymorphism นี้ ก็ไม่พ้นสิ่งรอบๆ ตัวเรานั่นเอง ผมยกตัวอย่าง จักรยาน ก็แล้วกัน ไม่ว่าจะเป็นยี่ห้ออะไร model อะไรก็ตาม หลักการมันเหมือนกัน คือ นั่งคร่อม จับ hand แล้วก็ถีบ เหมือนกันทั้งนั้น ดังนั้น เมื่อคุณปั่นได้ยี่ห้อหนึ่ง คุณก็สามารถไปปั่นยี่ห้ออะไรก็ได้ นั่นคือแนวคิดพื้นฐานของ polymorphism ครับ คือคุณมองมันว่ามันก็คือจักรยาน ไม่ได้มองว่ามันคือ ยี่ห้อใดๆ รุ่นใดๆ ไม่ว่ามันจะ รุ่นใดๆ หรือ ยี่ห้อใดๆ มันก็ยังคงเป็นจักรยานอยู่ดีใช่ไหมครับ เราจึงบอกว่า มันเป็นสิ่งเดียวกัน แต่มีหลายรูปแบบเท่านั้น

    เกือบทุกอย่างในโลกที่มนุษย์ประดิษฐ์ขึ้น ใช้หลัก Polymorphism ด้วยกันทั้งนั้น รถยนต์ , โทรศัพท์, โทรทัศน์ ก็ใช่ทั้งนั้น และในโลกคอมพิวเตอร์หละ ถ้าพูดถึง hardware ก็ใช่ทั้งนั้นแหละครับ การเขียนโปรแกรม ก็เป็นตัวอย่างได้ดีคือพวกตระกูล Visual คุณมี form  คุณเอา control ต่างๆ ไปใส่ไว้ใน form ซึ่ง form มันไม่รับรู้หรอกครับว่า นี่คือ Text Box , list box หรืออะไรก็ตามแต่ มันมองทุกอย่างที่ไปแปะใส่มันเป็น เป็นสิ่งเดียวกันหมด ที่เรียกว่า control เท่านั้น

    ประโยชน์ที่ได้รับจาก polymorphism คืออะไรหละ เห็นง่ายๆ ครับ คือว่าถ้าคุณไม่แหกคอกออกแบบทำลาย polymorphism โทรศัพท์ที่คุณออกแบบ จะสามารถใช้คุยกับโทรศัพท์เครื่องอื่นได้ทั่วโลก และผู้ใช้เมื่อซื้อไปก็เอาไปใช้ได้เลยไม่ต้องเรียนรู้ ถ้าเป็นเรื่องพวก visual คุณสามารถทำ control ใหม่ๆ มาแปะใส่ form ได้เลย มันก็ยังสามารถใช้งานร่วมกัน control อื่นๆ ได้

    ที่พูดไปคุณคงเข้าใจ แต่คุณคงนึกไม่ออกว่ามันประยุกต์มาเป็นเรื่อง OOP ได้อย่างไร คำพูดของผมต่อไปนี้ ผมคิดว่าคุณจะกระจ่างทันที 

    ในการเขียนโปรแกรมเรา code เป็นส่วนๆ ถ้ามองในมุมการเรียกและการถูกเรียก มีก็มีได้เพียงสองอย่าง คือ code นั้นจะเป็นผู้เรียก หรือผู้ถูกเรียก แนวคิดของการทำ Inheritance เป็นความพยายามที่จะ Re-use code ในส่วนของผู้ถูกเรียก กล่าวคือ การ Inheritance มาจะได้ class ใหม่ ใน code ที่เราเขียนต้องไป new() มาใช้  เมื่อเรา new() code นั้นมาใช้ object ที่ new() เราถือว่าเป็นผู้ถูกเรียก ส่วน code ที่ใช้คำสั่ง new() เราถือว่าเป็น code ผู้เรียก ใช่ไหมครับ

    ส่วน Polymorphsim นั้น กล่าวได้ว่าเป็นการ re-use code ในส่วนของผู้เรียกนั้นเอง คือคุณเขียน code ไว้แล้ว มันสามารถเรียก class ได้ 3 ชนิด ถ้าคุณทำมันมีมาตรฐานพอ ใครก็สามารถมาสร้างเป็นชนิดที่ 4 ที่ 5 ต่อไปได้อีก เห็นหรือเปล่าว่ามัน re-use code ในส่วนผู้เรียกได้ 

    การเขียนโปรแกรมลักษณะ plug-in ก็เป็นตัวอย่างที่ดีสำหรับเรื่องนี้ เช่นโปรแกรม Winamp, photoshop อะไรทำนองนี้เป็นต้น ถ้ามองในมุมของ polymorphism คือ code ของ winamp เขียนทีเดียว แต่คนอื่นสามารถ re-use code ส่วนนั้นได้ เอาไปเขียนเป็น plug-in หรือ skin ก็ตามแต่ 

    อีกตัวอย่างที่ง่ายๆ ครับคือ System.Console.WriteLine() ที่ทุกคนคุ้นเคย  เป็นอันรู้กันว่ามันเก่งไม่น้อยหน้า printf() ของภาษา C แต่มันมีดีกว่านั้นครับ คือมันมีคุณสมบัติของ Polymorphism คือคุณมันสามารถรองรับชนิดใหม่ๆ ได้ ซึ่งก็คือ object ที่คุณสร้างขึ้นมาเอง และถ้าคุณเพิ่มเติมคุณสมบัิติอีกนิดหน่อย WriteLine() ก็จะสามารถพิมพ์ค่าที่คุณต้องการแสดงจาก object ของคุณได้ เราจะมาเรียนเรื่องนี้ในบทต่อๆ ไปครับ

    คุณคงเห็นภาพแล้วนะครับว่า Polymorphism เป็นส่วนเติมเรื่อง re-use code ของ Inheritance อย่างไร