METHODS Different between Method Overriding and Method Hiding in C#ประวิทย์ ไชยรัตน์สัมพันธ์ 650710564
C# Method Overriding
ในหัวข้อนี้เราสามารถเปลี่ยนแปลงพฤติกรรมหรือการทำงานของเมธอดในคลาสลูกที่ได้รับการสีบทอด(Inheritance) มาจากจากคลาสแม่ ซึ่งแน่นอนว่าเราจะต้องมีคลาสให้ใช้งาน 2 คลาสก็คือคลาสแม่ที่เป็นคลาสหลักและคลาสลูกที่รับมาจากคลาสแม่นั่นเองครับ ซึ่งเมธอดที่ถูก override ในคลาสแม่ต้องประกาศคีย์เวิร์ด "virtual" และ เมธอดในคลาสลูกต้องประกาศคีย์เวิร์ด "override" ด้วยนั่นเองครับ
Copy 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 ();
}
}
Copy class Payment {
public void processPayment() {
System.out.println("Processing generic payment.");
}
}
class CreditCardPayment extends Payment {
@Override
public void processPayment() {
System.out.println("Processing credit card payment.");
}
}
class PayPalPayment extends Payment {
@Override
public void processPayment() {
System.out.println("Processing PayPal payment.");
}
}
public class PaymentDemo {
public static void main(String[] args) {
Payment creditCard = new CreditCardPayment();
creditCard.processPayment();
Payment paypal = new PayPalPayment();
paypal.processPayment();
}
}
Copy class Payment:
def process_payment(self):
print("Processing generic payment.")
class CreditCardPayment(Payment):
def process_payment(self):
print("Processing credit card payment.")
class PayPalPayment(Payment):
def process_payment(self):
print("Processing PayPal payment.")
if __name__ == "__main__":
credit_card = CreditCardPayment()
credit_card.process_payment()
paypal = PayPalPayment()
paypal.process_payment()
Copy #include <stdio.h>
typedef struct {
void (*processPayment)(void);
} Payment;
void genericPayment() {
printf("Processing generic payment.\n");
}
void creditCardPayment() {
printf("Processing credit card payment.\n");
}
void paypalPayment() {
printf("Processing PayPal payment.\n");
}
int main() {
Payment payment;
payment.processPayment = genericPayment;
payment.processPayment();
payment.processPayment = creditCardPayment;
payment.processPayment();
payment.processPayment = paypalPayment;
payment.processPayment();
return 0;
}
Processing credit card payment.
Processing PayPal payment.
Processing credit card payment.
Processing PayPal payment.
Processing credit card payment.
Processing PayPal payment.
Copy Processing generic payment.
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
Copy 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();
}
}
Copy class Payment {
public static void processPayment() {
System.out.println("Processing generic payment.");
}
}
class CreditCardPayment extends Payment {
public static void processPayment() {
System.out.println("Processing credit card payment.");
}
}
class PayPalPayment extends Payment {
public static void processPayment() {
System.out.println("Processing PayPal payment.");
}
}
public class Main {
public static void main(String[] args) {
Payment creditCard = new CreditCardPayment();
creditCard.processPayment();
Payment paypal = new PayPalPayment();
paypal.processPayment();
CreditCardPayment.processPayment();
PayPalPayment.processPayment();
}
}
Copy class Payment:
def process_payment(self):
print("Processing generic payment.")
class CreditCardPayment(Payment):
def process_payment(self):
print("Processing credit card payment.")
class PayPalPayment(Payment):
def process_payment(self):แม่)
print("Processing PayPal payment.")
payment = Payment()
credit_card = CreditCardPayment()
paypal = PayPalPayment()
payment.process_payment()
credit_card.process_payment()
paypal.process_payment()
Copy #include <stdio.h>
typedef struct {
void (*process_payment)();
} Payment;
void process_generic_payment() {
printf("Processing generic payment.\n");
}
typedef struct {
Payment parent;
void (*process_payment)();
} CreditCardPayment;
void process_credit_card_payment() {
printf("Processing credit card payment.\n");
}
typedef struct {
Payment parent;
void (*process_payment)();
} PayPalPayment;
void process_paypal_payment() {
printf("Processing PayPal payment.\n");
}
int main() {
Payment payment;
payment.process_payment = process_generic_payment;
CreditCardPayment credit_card;
credit_card.parent = payment;
credit_card.process_payment = process_credit_card_payment;
PayPalPayment paypal;
paypal.parent = payment;
paypal.process_payment = process_paypal_payment;
payment.process_payment();
credit_card.process_payment();
paypal.process_payment();
return 0;
}
Processing generic payment.
Processing generic payment.
Processing credit card payment.
Processing PayPal payment.
Processing generic payment.
Processing generic payment.
Processing credit card payment.
Processing PayPal payment.
Processing generic payment.
Processing credit card payment.
Processing PayPal 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 7 months ago