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

# Different between Method Overriding and Method Hiding in C\#

## C# Method Overriding

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

{% tabs %}
{% tab title="C#" %}
```csharp
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(); 
    }
}
```
{% endtab %}

{% tab title="Java" %}
```java
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();
    }
}

```
{% endtab %}

{% tab title="Python" %}
```python
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() 

```
{% endtab %}

{% tab title="C" %}
```c
#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;
}

```
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="C#" %}
Processing credit card payment. \
Processing PayPal payment.
{% endtab %}

{% tab title="Java" %}
Processing credit card payment. \
Processing PayPal payment.
{% endtab %}

{% tab title="Python" %}
Processing credit card payment. \
Processing PayPal payment.
{% endtab %}

{% tab title="C" %}
```
Processing generic payment.
Processing credit card payment.
Processing PayPal payment.
```
{% endtab %}
{% endtabs %}

* จะเห็นได้จากโค้ดตัวอย่างข้างต้นว่า 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 ไม่ใช่ชนิดของออฟเจกต์จริงๆ โดยวิธีการสร้างนั้นก็ต้องมีคลาสแม่และคลาสลูกเหมือนเดิมแต่จะใช้คีย์เวิร์ด <mark style="color:orange;">"new"</mark> เพื่อทำการซ่อนเมธอดที่จะซ่อนจากคลาสแม่ และก็อีกอย่างที่รู้ไว้หน่อยก็ได้คือ Method Hiding นั้นไม่ใช่ polymorphism เพราะเป็นการ bindling ขณะ compile-time

{% tabs %}
{% tab title="C#" %}
```csharp
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();
    }
}

```
{% endtab %}

{% tab title="Java" %}
```java
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();
    }
}

```
{% endtab %}

{% tab title="Python" %}
```python
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()

```
{% endtab %}

{% tab title="C" %}
```c
#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;
}

```
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="C#" %}
Processing generic payment.\
Processing generic payment.\
Processing credit card payment.\
Processing PayPal payment.
{% endtab %}

{% tab title="Java" %}
Processing generic payment.\
Processing generic payment.\
Processing credit card payment.\
Processing PayPal payment.
{% endtab %}

{% tab title="Python" %}
Processing generic payment.\
Processing credit card payment.\
Processing PayPal payment.
{% endtab %}

{% tab title="C" %}
Processing generic payment.\
Processing credit card payment.\
Processing PayPal payment.
{% endtab %}
{% endtabs %}

* อย่างที่เคยบอกข้างต้นว่าใน 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

{% file src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2FS6BIhCZH9cIl7KL3jENg%2FSlide%20-%20Method%20Overridding%20vs%20Method%20Hiding.pdf?alt=media&token=e3019647-c428-4367-a4b5-52b6f5615944" %}

## Video Clip

{% embed url="https://www.youtube.com/watch?t=10s&v=gFF93mm0KpM" %}

## Reference

รายละเอียดการทำงานของ virtual, override, new เกี่ยวกับการสีบทอดคลาสใน C# [Method Overriding - Microsoft Docs](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/inheritance)

รายละเอียดการ Override ของ Java\
[Oracle Java Documentation](https://docs.oracle.com/javase/tutorial/java/IandI/override.html)

Python Official Documentation : [Inheritance in Python](https://docs.python.org/3/tutorial/classes.html#inheritance)

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

Overriding and Hiding Method : [Oracle Java Documentation](https://docs.oracle.com/javase/tutorial/java/IandI/override.html)

Difference between Method Overriding and Method Hiding \
: [geeksforgeeks](https://www.geeksforgeeks.org/difference-between-method-overriding-and-method-hiding-in-c-sharp/)\
: [stackoverflow](https://stackoverflow.com/questions/3838553/overriding-vs-method-hiding)\
: [Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/inheritance)



