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