Runtime (Dynamic) Polymorphism

ปฏิญญาพร สุดโท 650710561

Polymorphism

Polymorphism คือ การที่เราสามารถใช้ instance ที่มีชนิดของคลาสลูก (Derived Class) กับตัวแปรชนิดคลาสแม่ (Base Class) ได้

Runtime(Dynamic) Polymorphism

Runtime(Dynamic) Polymorphism ใน C# จะเรียกว่า virtual function ซึ่งคล้ายกับการทำ Method Overriding สำหรับ Method Overriding ก็คือ เทคนิคที่ทำให้เราสามารถเรียกใช้ฟังก์ชั่นจากคลาสแม่ (Base Class) ในคลาสลูก (Derived Class) ได้ โดยการสร้าง Method Overriding ในคลาสลูกนั้นจะต้องมี signature (ชื่อ, parameters, return type) เหมือนใน method ในคลาสแม่ และจะบอกว่าคลาสลูก override method ในคลาสแม่

keywords 3 ชนิดสำหรับ Method Overriding (Runtime Dynamic Polymorphism) ในภาษา C#

  • virtual keyword : เป็น keyword ที่ใช้สำหรับ modify method ในคลาสแม่ (Base Class) เพื่อใช้เขียนทับ (Overridden) method เฉพาะที่จะทำการ override ในคลาสลูก (Derived Class)

  • override : เป็น keyword ที่ใช้สำหรับ modify method ที่ override มาจากคลาสแม่ (Base Class) ในคลาสลูก (Derived Class)

  • base keyword : เป็น keyword ที่ใช้สำหรับเข้าถึงสมาชิกที่อยู่ในคลาสแม่ (Base Class) จากคลาสลูก (Derived Class) ปกติแล้วจะใช้เข้าถึง constructors และ methods / function ของ คลาสแม่ (Base Class) แต่จะใช้กับ method ที่เป็น static ไม่ได้

Example of Runtime(Dynamic) Polymorphism in C#

using System;
class Animal {
    public virtual void sound(){
        Console.WriteLine("animal makes a sound");
    }
}

class Dog : Animal {
    public override void sound()
    {
        Console.WriteLine("dog barks");
    }
}

class Cat : Animal {
    public override void sound()
    {
        Console.WriteLine("cat meow");
    }
}

class Test {
    public static void Main(){
        Animal an = new Animal();
        Animal d = new Dog();
        Animal c = new Cat();
        
        an.sound();
        d.sound();
        c.sound();
    }
}

จากในตัวอย่าง จะเป็นการสร้างคลาส Animal ที่เป็นคลาสแม่ (Base Class) คลาส Dog และ คลาส Cat ที่เป็นคลาสลูก (Derived Class) ที่สืบทอด (Inheritance) มาจากคลาสแม่ โดยที่มี method public virtual void sound() (บรรทัดที่ 3) เป็น method ในคลาสแม่ ซึ่งทำการพิมพ์ข้อความ " animal makes a sound " (บรรทัดที่ 4) และจะเห็นได้ว่าในคลาส Dog ที่เป็นคลาสลูกนั้น ใน (บรรทัดที่ 9) จะมี method public override void sound() ที่เป็น method ที่ override มาจาก public method virtual void sound() จากคลาส Animal ที่เป็นคลาสแม่ ซึ่งจะเป็นการพิมพ์ข้อความ " dog barks " (บรรทัดที่ 11) ออกมา และเช่นเดียวกันกับคลาส Cat ที่เป็นคลาสลูกที่ override method มาจากคลาส Animal ที่เป็นคลาสแม่ ซึ่งจะพิมพ์ข้อความ " cat meow " ออกมา

ซึ่งในส่วนของ method main (บรรทัดที่ 24) จะเป็นการสร้าง instance ของคลาส Animal ที่เก็บไว้ในตัวแปร 'an' และใน (บรรทัดที่ 25) จะเป็นการสร้าง instance ของคลาส Dog ซึ่งเป็นคลาสลูกของคลาส Animal ที่เก็บไว้ในตัวแปร 'd' ซึ่งเป็นตัวแปรประเภท Animal แต่ตัวแปร 'd' เป็น instance ของคลาส Dog เช่นเดียวกันใน (บรรทัดที่ 26) ซึ่งเป็นการสร้าง instance ของคลาส Cat ที่เป็นคลาสลูกของคลาส Animal ที่เก็บไว้ในตัวแปร 'c' ซึ่งเป็นตัวแปรประเภท Animal แต่ตัวแปร 'c' เป็น instance ของคลาส Cat

ซึ่งใน (บรรทัดที่ 28-30) เป็นการเรียกใช้ method ของ instance แต่ละตัว ซึ่งจะได้ผลลัพธ์ออกมาเป็นดัง output ด้านบน

Example of Runtime(Dynamic) Polymorphism in C# (2)

using System;

class web {
    
    string name = "GeeksForGeeks";
    
    public virtual void showdata()
    {
        Console.WriteLine("Website Name: " + name);
    }
}

class stream : web {

    string s = "Computer Science";

    public override void showdata()
    {
        base.showdata();
        Console.WriteLine("About: " + s);
    }
}
 
class GFG {

    static void Main()
    {
        stream E = new stream();
        E.showdata();
    }
}

ในตัวอย่างที่ 2 นี้ (บรรทัดที่ 19) จะเป็นการเรียกใช้ base keyword เพื่อเรียกใช้ method public virtual void showdata() จากคลาสแม่ ซึ่งมีการพิมพ์ข้อความ " Website Name: GeeksForGeeks "

เปรียบเทียบ Runtime(Dynamic) Polymorphism ในภาษา C# กับภาษาต่างๆ

Runtime Dynamic Polymorphism (ในภาษา C#) จะมีความแตกต่างในเรื่องของ keyword virtual และ base keyword ส่วน keyword override นั้นจะมีการใช้เหมือนกันในภาษา Java และ base keyword (บรรทัดที่ 19 C#) ที่เป็นการเรียกใช้ method ของคลาสแม่เรียกใช้ในคลาสลูก (ในภาษา Java) นั้น จะเป็นการใช้ keyword super แทน (บรรทัดที่ 18 Java) ซึ่งคล้ายกับภาษา Python (บรรทัดที่ 14) และ (ในภาษา C++) จะคล้ายกับ C# อยู่ตรงที่มีการใช้ keyword virtual และ keyword override เหมือนกับภาษา C# เลยแต่จะต่างกันตรงที่การเรียกใช้ method ของคลาสแม่ หรือ base keyword (ใน C#) ด้วยการใช้ web::showdata() (บรรทัดที่ 29) และ (ในภาษา C) จะมีความแตกต่างจากภาษาอื่นๆตรงที่โครงสร้างจะไม่เหมือนภาษาอื่นๆ เพราะไม่รองรับการเขียนแบบ OOP ซึ่งสามารถเขียนได้โดยจะใช้ โครงสร้าง struct และใช้ pointers สร้าง inheritance และการ override นั่นเอง ซึ่งจะมี method Initialize ตัว constructor แยกออกมาอีกทีใน (บรรทัดที่ 25-28 และ 30-34)

using System;

class web {
    
    string name = "GeeksForGeeks";
    
    public virtual void showdata()
    {
        Console.WriteLine("Website Name: " + name);
    }
}

class stream : web {

    string s = "Computer Science";

    public override void showdata()
    {
        base.showdata();
        Console.WriteLine("About: " + s);
    }
}
 
class GFG {

    static void Main()
    {
        stream E = new stream();
        E.showdata();
    }
}

Video Presentation

Slide Presentation

Reference

  • ใช้ศึกษาเกี่ยวกับ Runtime Dynamic Polymorphism และ Method Overriding ใน ภาษา C#

  • ใช้ศึกษาเกี่ยวกับ Method Overriding ใน ภาษา Java

  • ใช้ศึกษาเกี่ยวกับ Method Overriding ใน ภาษา Python

  • ใช้ศึกษาเกี่ยวกับ Method Overriding ใน ภาษา C++

  • ใช้ศึกษาเกี่ยวกับโครงสร้าง struct ของ ภาษา C

  • ตัวอย่างของโค้ดที่นำมาเป็นตัวอย่างข้างต้นดัดแปลงมาจาก Code ในภาษา C++ ของอาจารย์ในคาบเรียนค่ะ

  • ส่วนของโค้ดที่นำมาเปรียบเทียบกับภาษาอื่นๆ เป็นโค้ดที่นำมาจากเว็บของ Method Overriding ของ C#

Last updated