Different between Method Overriding and Method Hiding in C#

ประวิทย์ ไชยรัตน์สัมพันธ์ 650710564

C# Method Overriding

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

using System;

class Payment
{
    public virtual void ProcessPayment()
    {
        Console.WriteLine("Processing generic payment.");
    }
}

class CreditCardPayment : Payment
{
    public override void ProcessPayment()
    {
        Console.WriteLine("Processing credit card payment.");
    }
}

class PayPalPayment : Payment
{
    public override void ProcessPayment()
    {
        Console.WriteLine("Processing PayPal payment.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Payment creditCard = new CreditCardPayment();
        creditCard.ProcessPayment(); 

        Payment paypal = new PayPalPayment();
        paypal.ProcessPayment(); 
    }
}

Processing credit card payment. Processing PayPal payment.

  • จะเห็นได้จากโค้ดตัวอย่างข้างต้นว่า C# และ Java นั้นเป็นภาษาที่รองรับ OOP ได้อย่างเต็มรูปแบบมีคีย์เวิร์ดที่กำหนดขึ้นมาให้ใช้งาน Overriding ได้อย่างค่อนข้างง่ายโดยมีคีย์เวิร์ด "virtual", "override", "@Override"(Java)

  • ในส่วนของ Python ต้องถือว่ามีความยืดหยุ่นที่สูงมากเลยทีเดียวเพราะไม่จำเป็นต้องใช้คีย์เวิร์ดใดๆเลยเพียงแค่ประกาศฟังก์ชันที่ชื่อเหมือนกันกับคลาสแม่ในคลาสลูกเพียงเท่านี้ก็ได้คอนเซป Override แล้วในส่วนนี้

  • C ไม่มีการ Override เพราะไม่มีแนวคิดการทำงานของหลัก OOP โดยตรง แต่เราสามารถใช้การจำลองได้ผ่าน Struct และใช้ pointer-to-function เพื่อชี้ไปยังฟังก์ชันที่ต้องการเรียกใช้งานเพื่อเลียนแบบพฤติกรรมของ Method Override

C# Method Hiding

ต่อมาในหัวข้อนี้นั้นง่ายๆคือตามชื่อเลยครับคือการซ่อน method ของคลาสลูกจากคลาสแม่ โดยการเรียกใช้จะขึ้นอยู่กับชนิดตัวแปรที่ใช้ขณะ compile-time ไม่ใช่ชนิดของออฟเจกต์จริงๆ โดยวิธีการสร้างนั้นก็ต้องมีคลาสแม่และคลาสลูกเหมือนเดิมแต่จะใช้คีย์เวิร์ด "new" เพื่อทำการซ่อนเมธอดที่จะซ่อนจากคลาสแม่ และก็อีกอย่างที่รู้ไว้หน่อยก็ได้คือ Method Hiding นั้นไม่ใช่ polymorphism เพราะเป็นการ bindling ขณะ compile-time

using System;

class Payment
{
    public virtual void ProcessPayment()
    {
        Console.WriteLine("Processing generic payment.");
    }
}

class CreditCardPayment : Payment
{
    public new void ProcessPayment()
    {
        Console.WriteLine("Processing credit card payment.");
    }
}

class PayPalPayment : Payment
{
    public new void ProcessPayment()
    {
        Console.WriteLine("Processing PayPal payment.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Payment creditCard = new CreditCardPayment();
        creditCard.ProcessPayment();

        Payment paypal = new PayPalPayment();
        paypal.ProcessPayment();

        CreditCardPayment actualCreditCard = new CreditCardPayment();
        actualCreditCard.ProcessPayment();yment.

        PayPalPayment actualPayPal = new PayPalPayment();
        actualPayPal.ProcessPayment();
    }
}

Processing generic payment. Processing generic payment. Processing credit card payment. Processing PayPal payment.

  • อย่างที่เคยบอกข้างต้นว่าใน C# เราสามารถใช้คีย์เวิร์ด new ในคลาสลูกเพื่อซ่อนเมธอดจากคลาสแม่ได้เลย

  • Java จะสามารถทำ Method Hiding ได้ก็ต่อเมื่อใช้เมธอดแบบ static เพราะการซ่อนเมธอดทำได้เฉพาะกับ static method เท่านั้น

  • Python ในภาษานี้นั้น Method Hiding จะไม่มีการบังคับแบบภาษาอื่นเท่าไหร่นักเพราะไม่มีคอนเซป method Hiding และเป็นภาษาแบบไดนามิกอีกทั้งยังรองรับการทำงานแบบ OOP ที่ยืดหยุ่นกว่าอีกด้วย ซึ่งสามารถซ่อนเมธอดได้ผ่านการตั้งชื่อเมธอดที่ชื่อเดียวกันในคลาสลูก โดยไม่ได้ใช้การ overriding

  • เหมือนเดิมใน C นั้นไม่ได้ถูกออกแบบมาสำหรับ OOP จึงไม่มี hiding เช่นกัน แต่เราสามารถใช้ struct และ pointer-to-function เพื่อเลียนแบบการทำงานของ hiding ได้

Summary

Method Override เป็นการแทนที่การทำงานของเมธอดในคลาสแม่ด้วยการกำหนดใหม่ในคลาสลูกที่สามารถทำงานร่วมกันได้ใน Polymorphism ในขณะที่ Method Hiding คือการสร้างเมธอดที่ซ่อนเมธอดของคลาสแม่โดยใช้ชื่อเดียวกัน ซึ่งจะไม่มี Polymorphism โดยเมธอดที่ถูกซ่อนในคลาสลูกจะไม่ถูกเรียกใช้เมื่อเรียกผ่านตัวแปรประเภทของคลาสแม่

Presentation

Video Clip

Reference

รายละเอียดการทำงานของ virtual, override, new เกี่ยวกับการสีบทอดคลาสใน C# Method Overriding - Microsoft Docs

รายละเอียดการ Override ของ Java Oracle Java Documentation

Python Official Documentation : Inheritance in Python

รายละเอียดการการสร้างและใช้งาน Struct ในบทที่ 6 และ pointer-to-function ในบทที่ 5 หน้า 118 จากหนังสือ The C Programming Language โดย W. Kernighan และ Dennis M. Ritchie (K&R)

Overriding and Hiding Method : Oracle Java Documentation

Difference between Method Overriding and Method Hiding : geeksforgeeks : stackoverflow : Microsoft Learn

Last updated