Polymorphism

11 February 2016

ในบทนี้ คุณจะได้รู้จักกับคุณสมบัติ Polymorphism ในภาษา C# ซึ่งเป็นคุณสมบัติที่สำคัญเป็นอันดับที่สามในการเขียนโปรแกรมเชิงวัตถุ หลังจาก Inheritance และ Encapsulation ซึ่ง Polymorphism นั้นเป็นคำที่มาจากภาษากรีก มีความหมายว่า "หลายรูปแบบ"

Polymorphism คืออะไร

Polymorphism นั้นคือการมีได้หลายรูปแบบ โดยมันเป็นคำที่ถูกใช้ในการเขียนโปรแกรมเชิงวัตถุ โดยคลาสหลัก (Base class) สามารถกำหนดเมธอดให้เป็น Virtual เมธอด และคลาสลูก (Derived class) สามารถทำการ Override เมธอดเหล่านั้นได้ ซึ่งหมายความว่าคลาสหลักสามารถกำหนดเมธอดที่เป็นของตัวเองและให้คลาสอื่นนำไปแก้ไขได้ และในตอนโปรแกรมทำงาน เราสามารถเรียกใช้เมธอดในคลาสหลัก และได้ผลลัพธ์การทำงานของคลาสลูกแทน

มาดูตัวอย่างสำหรับ Polymorphism ในภาษา C# ยกตัวอย่างเช่น เรามีคลาสของสัตว์ ซึ่งสัตว์แต่ละชนิดนั้นสามารถที่จะเคลื่อนที่ได้ แต่วิธีการเคลื่อนที่ของมันแตกต่างกันออกไป

using System;

namespace Polymorphism
{
    class Animals
    {
        public string name;
        public int height;
        public int weight;

        public virtual void Move()
        {
            Console.WriteLine("Perform base class move");
        }
    }

    class Dog : Animals
    {
        public override void Move()
        {
            Console.WriteLine("Running on the ground");
            base.Move();
        }
    }

    class Fish : Animals
    {
        public override void Move()
        {
            Console.WriteLine("Swimming in the water");
            base.Move();
        }
    }

    class Bird : Animals
    {
        public override void Move()
        {
            Console.WriteLine("Frying in the air");
            base.Move();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Animals animal1 = new Dog();
            Animals animal2 = new Fish();
            Animals animal3 = new Bird();

            animal1.Move();
            animal2.Move();
            animal3.Move();
        }
    }
}

ในตัวอย่าง เราได้มีคลาส Animals ซึ่งเป็นคลาสหลักและภายในคลาสมีเมธอด Move() ซึ่งได้ถูกกำหนดให้เป็น virtual เมธอดเพื่อให้คลาสอื่นที่สืบทอดจากมันสามารถ override เมธอดนี้ได้ ต่อมาเราได้สร้างคลาสของสัตว์อีกสามคลาส คือ Dog Fish และ Bird และในแต่ละคลาสได้ทำการ override เมธอด Move() สำหรับการเคลื่อนที่ของสัตว์แต่ละชนิด และในเมธอดเหล่านี้ยังเรียกใช้เมธอดของคลาสหลัก

Animals animal1 = new Dog();
Animals animal2 = new Fish();
Animals animal3 = new Bird();

animal1.Move();
animal2.Move();
animal3.Move();

ต่อมาเราได้นำคลาสเหล่านี้มาสร้างออบเจ็ค ในตอนสร้างออบเจ็คเราใช้คลาส Animals ในการประกาศตัวแปรออบเจ็ค และสร้างออบเจ็คจากคลาสลูก ซึ่ง Polymorphism ก็คือคลาสหลักสามารถที่จะนำไปสร้างออบเจ็คของคลาสลูกได้ นั่นหมายความว่าตัวแปรออบเจ็คที่สร้างจากคลาส Animals สามารถที่จะทำงานในคลาสลูกของมันได้ เช่น animal1 นั้นทำงานเป็นคลาส Dog และ animal2 ทำงานเป็นคลาส Fish

Running on the ground
Perform base class move
Swimming in the water
Perform base class move
Frying in the air
Perform base class move

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

ต่อไปมาดูตัวอย่างเพิ่มเกี่ยวกับการใช้ประโยชน์จาก Polymorphism ซึ่งจะทำให้การเขียนโปรแกรมยืดหยุ่นและมีประสิทธิภาพมากขึ้น

using System;
using System.Collections.Generic;

namespace Polymorphism
{
    class Animals
    {
        public string name;
        public int height;
        public int weight;

        public virtual void Move()
        {
            Console.WriteLine("Perform base class move");
        }
    }

    class Dog : Animals
    {
        public override void Move()
        {
            Console.WriteLine("Running on the ground");
            base.Move();
        }
    }

    class Fish : Animals
    {
        public override void Move()
        {
            Console.WriteLine("Swimming in the water");
            base.Move();
        }
    }

    class Bird : Animals
    {
        public override void Move()
        {
            Console.WriteLine("Frying in the air");
            base.Move();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // arrays
            Animals[] animalArray = new Animals[3];
            animalArray[0] = new Dog();
            animalArray[1] = new Fish();
            animalArray[2] = new Bird();

            Console.WriteLine("C# Arrays:");
            foreach (Animals a in animalArray)
            {
                AnimalMove(a);
            }

            // Generic
            List<Animals> animalList = new List<Animals>();
            animalList.Add(new Dog());
            animalList.Add(new Fish());
            animalList.Add(new Bird());

            Console.WriteLine("\nC# Generic:");
            foreach (Animals a in animalList)
            {
                AnimalMove(a);
            }

        }

        public static void AnimalMove(Animals a)
        {
            a.Move();
        }
    }
}

ในตัวอย่าง เป็นการใช้คลาสจากตัวอย่างก่อนหน้า แต่เราเปลียนแปลงการนำมาใช้งานในเมธอด Main() โดยการใช้อาเรย์และลิสต์สำหรับกำหนดตัวแปรออบเจ็คของคลาสลูกแทน ดังนั้นาเราจึงใช้คลาส Animals สำหรับประกาศอาเรย์และลิสต์ ซึ่งสามารถใช้เก็บออบเจ็คใดๆ ที่สร้างมาจากคลาสที่สอบทอดมันเอง

foreach (Animals a in animalArray)
{
    AnimalMove(a);
}
...
public static void AnimalMove(Animals a)
{
    a.Move();
}

นี่เป็นการใช้คำสั่ง Foreach ในการวนอ่านค่าในอาเรย์ เราส่งออบเจ็คไปยังเมธอด AnimalMove() เช่นเดียวกันในคำสั่ง Foreach และเมธอด เราใช้คลาส Animals เป็นพารามิเตอร์ของออบเจ็ค และเรียกใช้เมธอด Move() จากออบเจ็คของคลาสหลัก สิ่งที่สำคัญก็คือเราไม่ต้องสนใจว่าจะสร้างมาจากคลาสไหน แต่เมื่อเราเรียกใช้เมธอด Move() มันจะทำหน้าที่ให้สอดคล้องกับคลาสที่ใช้สร้างออบเจ็ค

C# Arrays:
Running on the ground
Perform base class move
Swimming in the water
Perform base class move
Frying in the air
Perform base class move

C# Generic:
Running on the ground
Perform base class move
Swimming in the water
Perform base class move
Frying in the air
Perform base class move

และนี่เป็นผลลัพธ์ของตัวอย่างที่สองการใช้งาน Polymorphism ในภาษา C# ซึ่งคุณจะเห็นว่าเราไม่จำเป็นต้องยึดติดกับคลาสลูก เช่น เมื่อคุณต้องการสร้างออบเจ็คจากคลาส Dog คุณไม่จำเป็นต้องประกาศออบเจ็คโดยคลาสดังกล่าว

ในบทนี้ คุณได้เรียนรู้และการใช้งานเกี่ยวกับ Polymorphism ในภาษา C# ซึ่งมันมีประโยชน์ที่จะช่วยให้โปรแกรมของเรามีความยืดหยุ่นมากขึ้น และใช้งานง่ายขึ้น เช่น ในตัวอย่างเราได้เก็บตัวแปรออบเจ็คจากคลาสต่างๆ ในอาเรย์ที่สร้างจากคลาสหลักของมัน ซึ่งถ้าหากปราศจาก Polymorphism คุณจะต้องสร้างอาเรย์ในการที่จะเก็บข้อมูลของแต่ละคลาสแยกออกไป นอกจากนี้ นอกจากนี้ในภาษา C# ยังมี Polymorphism แบบอื่นอีก เช่น Method Overloading หรือ Operators Overloading เป็นต้น

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