Polymorphism

15 October 2016

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 และเข้าใจแนวคิดในการนำไปใช้งานเกี่ยวกับการมีได้หลายรูปแบบของออบเจ็ค ซึ่งเราสามารถนำคลาสมาสร้างออบเจ็คและใช้งานได้อย่างยืดหยุ่น

บทความนี้เป็นประโยชน์หรือไม่?Yes·No