Polymorphism
Polymorphism เป็นคุณสมบัติที่สำคัญเป็นอันดับที่สามในการเขียนโปรแกรมเชิงวัตถุ ต่อจากคุณสมบัติการห่อหุ่มและการสืบทอด คำว่า Polymorphism นั้นเป็นคำศัพท์ที่มาจากภาษากรีก ซึ่งหมายความว่า "หลากหลายรูปแบบ" ดังนั้นในการเขียนโปรแกรม Polymorphism ก็คือการมีได้หลายรูปแบบของออบเจ็ค และในบทนี้คุณจะได้เรียนรู้เกี่ยวกับ Polymorphism ในภาษา Visual Basic
ในภาษา Visual Basic Polymorphism มักจะเกี่ยวข้องกับ base class และ delivered class ซึ่งจะมีสองลักษณะดังนี้
- ในขณะ run time ออบเจ็คของ delivered class สามารถทำตัวเป็นเหมือนออบเจ็คของ base class ได้ ทำให้ประเภทของคลาสที่ประกาศออบเจ็คไม่มีผลกับการใช้งาน
- base class อาจจะกำหนดให้เมธอดสามารถ override ได้ ใน run time เมื่อโปรแกรมได้มีการเรียกใช้เมธอดทางตัวแปรของ base class แต่เมธอดใน delivered class จะถูกเรียกใช้แทน
ตัวอย่างการใช้งาน Polymorphism
ต่อไปมาดูตัวอย่างในการใช้งานของการมีหลายรูปแบบของออบเจ็ค เราจะสร้างคลาส Animal
ซึ่งเป็น base class และสร้างอีกสามคลาสที่จะสืบทอดจากคลาสนี้ และคลาสเหล่านี้จะสามารถใช้ base class ของมันในการประกาศออบเจ็คได้
Class Animal
Overridable Sub Move()
Console.WriteLine("Perform moving in base class")
End Sub
End Class
Class Dog
Inherits Animal
Public Overrides Sub Move()
Console.WriteLine("Dog is running")
MyBase.Move()
End Sub
End Class
Class Bird
Inherits Animal
Public Overrides Sub Move()
Console.WriteLine("Bird is flying")
MyBase.Move()
End Sub
End Class
Class Fish
Inherits Animal
Public Overrides Sub Move()
Console.WriteLine("Fish is swimming")
MyBase.Move()
End Sub
End Class
Module Module1
Sub Main()
Dim animals(2) As Animal
animals(0) = New Dog()
animals(1) = New Bird()
animals(2) = New Fish()
For Each animal As Animal In animals
animal.Move()
Next
End Sub
End Module
ในตัวอย่างมีคลาส Animal
ซึ่งภายในคลาสมีเมธอด Move()
เป็นเมธอดในการเคลื่อนที่ของสัตว์ และเราสร้างคลาสอีกสามคลาสคือ Dog
ฺBird
และ Fish
ซึ่งสืบทอดจากคลาส Animal และแต่ละคลาสทำการ override เมธอด Move()
ตามวิธีการเคลื่อนที่ของสัตว์แต่ละชนิด
Class Dog
Inherits Animal
Public Overrides Sub Move()
Console.WriteLine("Dog is running")
MyBase.Move()
End Sub
End Class
นี่เป็นตัวอย่างสำหรับคลาส Dog
เราทำการ override เมธอดจาก base class เพราะว่าสัตว์แต่ละชนิดมีการเคลื่อนที่ที่แตกต่างกัน การใช้คำสั่ง MyBase.Move()
สำหรับเรียกใช้เมธอดใน base class ถึงแม้การเคลื่อนที่ของสัตว์แต่ละชนิดจะแตกต่างกัน แต่ก็จะมีการทำงานพื้นฐานบางอย่างที่เหมือนกัน เช่น การเคลื่อนไหวของกล้ามเนื้อ หรือการเพิ่มขึ้นของระยะทางที่เคลื่อนที่ไปได้ เป็นต้น ซึ่งนี่เป็นสิ่งที่ทำใน base class นั่นเอง
Dim animals(3) As Animal
animals(0) = New Dog()
animals(1) = New Bird()
animals(2) = New Fish()
ในเมธอด Main()
เราสร้างออบเจ็คจาก delivered class แบบต่างๆ เราสามารถใช้คลาส Animal
สำหรับการประกาศตัวแปรของออบเจ็ค (object instance) ได้ และในตอนสร้างออบเจ็คนั้นสร้างโดย delivered class ซึ่งนี่เองเป็นที่มาของการมีได้หลายรูปแบบหรือ Polymorphism ของออบเจ็ค โดยที่อาเรย์ animals
สามารถนำไปสร้างออบเจ็คได้ทุกประเภทที่สืบทอดมาจากคลาส Animal
หรือแม้กระทั่งตัวมันเอง
For Each animal As Animal In animals
animal.Move()
Next
ต่อมาเป็นการเรียกใช้งานเมธอด Move()
ซึ่งจากคำสั่งนี้ทำให้โปรแกรมทำงานในเมธอดของ delivered class ซึ่งเป็นผลมาจากการ override ของเมธอด ซึ่งมันมีประโยชน์มากในการที่จะใช้ประเภทตัวแปรเดียวแต่เก็บออบเจ็คต่างประเภทกันและทำงานได้ต่างกัน โดยการใช้คำสั่งเดียวคือ animal.Move()
นี่เป็นสิ่งที่เรียกว่า Polymorphism โดยเราไม่ต้องใจว่าเมธอดนั้นจะเป็นของออบเจ็คชนิดไหนและทำงานอย่างไร แต่เมื่อเราเรียกใช้ธอดดังกล่าวมันจะทำงานตามประเภทของออบเจ็ค
Dog is running
Perform moving in base class
Bird is flying
Perform moving in base class
Fish is swimming
Perform moving in base class
นี่เป็นผลลัพธ์ในการทำงานของโปรแกรม
แต่สิ่งหนึ่งที่คุณควรระวังสำหรับ Polymorphism คือถ้าหากคุณได้สร้างเมธอดใหม่ใน delivered class ซึ่งไม่ได้ override จาก base class คุณจะไม่สามารถเรียกใช้งานเมธอดนั้นผ่าน instance ของ base class ได้ ยกตัวอย่างเช่น ถ้าคุณมีเมธอด Eat()
ในคลาส Dog
คุณจะไม่สามารถเรียกใช้เมธอดผ่าน ตัวแปรที่ประกาศจากคลาส Animal
ได้ เพราะว่าเมธอดดังกล่าวถือว่าเป็นเมธอดภายใน delivered ที่ต้องเรียกใช้งานผ่านคลาสที่ถูกสร้างเท่านั้น
ในบทนี้ คุณได้เรียนเกี่ยวกับ Polymorphism ในภาษา Visual Basic และเข้าใจแนวคิดในการนำไปใช้งานเกี่ยวกับการมีได้หลายรูปแบบของออบเจ็ค ซึ่งเราสามารถนำคลาสมาสร้างออบเจ็คและใช้งานได้อย่างยืดหยุ่น