Abtraction in C#

ทยิดา มูลดำ 650710547

Abstraction เป็นหนึ่งในแนวคิดของ Object-Oriented Programming (OOP) ที่ต่อยอดมาจาก Encapsulation โดย Abstraction จะเป็นการซ่อนรายละเอียดการทำงานให้ผู้ใช้หรือตัวอ็อบเจกต์ไม่จำเป็นต้องทราบว่ามันมีรายละเอียดการทำงานภายในอย่างไร

ตัวอย่างในชีวิตจริง เช่น เราขับรถยนต์เราสามารถที่จะสตาร์ทรถ เบรก หรือเร่งเครื่องได้โดยที่เราไม่จำเป็นต้องทราบว่ามันมีกลไกการทำงานในการสตาร์ทรถ เบรก หรือเร่งเครื่องได้ยังไง

การทำ Abstraction ในภาษา C#

การทำ Abstraction ในภาษา C# สามารถทำได้โดยใช้ abstract classes หรือ interfaces ซึ่งช่วยให้สามารถสร้างโครงสร้างที่ชัดเจนในการออกแบบโปรแกรม โดยที่ผู้ใช้ไม่ต้องสนใจรายละเอียดการทำงานภายใน

เราจะสร้าง abstract class หรือ interface ขึ้นมาเป็นคลาสแม่แบบ ซึ่งจะมี abstract method (เมธอดที่ไม่มี body หรือส่วน implementation) เนื่องจากเราไม่สามารถสร้าง instance จาก abstract class หรือ interface ได้โดยตรง จึงต้องมีการสืบทอดให้คลาสลูกนำเมธอดเหล่านั้นไป implement เอง

abstract class vs interface

abstract class

  • ใช้คีย์เวิร์ด abstract ในการประกาศ class และ method, property, event หรือ indexer ที่ไม่มีส่วน body (เพื่อบ่งบอกว่ามันเป็น abstract)

  • มี fields, constants

  • abstract method ต้องถูก override ในคลาสลูก

  • มี constructor สำหรับใช้ในคลาสลูก

  • ใช้ access modifiers ได้ทั้ง public, private, protected

  • ใช้ static members ได้

  • ใช้หลักการ single inheritance คลาสลูกสามารถสืบทอดจาก abstract class ได้เพียงคลาสเดียว

โค้ดตัวอย่าง Abstraction จากการใช้ abstract class

using System;

public abstract class G { // abstract class
    public abstract void gfg1(); //abstract method (ซ่อนส่วนการทำงาน)
}

public class G1 : G {
    public override void gfg1() { // นำ abstract method มา implement
        Console.WriteLine("Class name is G1");
    }
}

public class main_method {
    public static void Main() {
        G obj;

        obj = new G1();
        obj.gfg1(); 
    }
}

จากโค้ด เราสร้างคลาส G เป็น abstract class ให้มีเมธอด gfg1() เป็น abstract method ไม่มีการ implement ใด ๆ ในเมธอดนี้ ซึ่งเป็นหลักการ Abstraction ซ่อนรายละเอียดการทำงานของเมธอด โดยเราจะให้มีการสืบทอดคลาส และบังคับให้คลาสลูก implement เมธอดเหล่านั้นเองผ่านการ override เมื่ออ็อบเจกต์ obj เรียกใช้งานเมธอด ก็สามารถทำได้โดยไม่ทราบการทำงานภายในของเมธอด gfg1()

interface

  • ใช้คีย์เวิร์ด interface ในการประกาศ interface

  • method, property, event หรือ indexer ไม่ต้องใช้คีย์เวิร์ด abstract มันจะเป็น abstract ไปโดยปริยาย

  • ไม่ต้องทำ override method ในคลาสลูก

  • ไม่มี constructor

  • ใช้ได้เฉพาะ public access modifier เท่านั้น ไม่รองรับ private หรือ protected

  • ไม่สามารถใช้ static members

  • รองรับ multiple inheritance คลาสลูกสืบทอดได้มากกว่าหนึ่ง interface

  • ตั้งแต่ C# 8.0 เป็นต้นไป interface สามารถมี default methods (เมธอดที่มีส่วน body หรือ implmentation) ซึ่งคลาสลูกไม่จำเป็นต้อง implement ใหม่

โค้ดตัวอย่าง Abstraction โดยใช้ interface

using System;

interface interface1 { // interface 1
    void show(); // abstract method, hiding implementation
}

interface interface2 { //interface 2
    void display(); //abstract method, hiding implementation
}

class MyClass : interface1, interface2 { //multiple inheritance
    public void show() {
        Console.WriteLine("Welcome to GeeksforGeeks!!!");
    }

    public void display() {
        Console.WriteLine("This is the second interface method.");
    }

    public static void Main(String[] args) {
        MyClass obj1 = new MyClass();
        obj1.show();
        obj1.display();
    }
}

จากโค้ดนี้ interface ทำ Abstraction ได้เช่นกัน เพราะใน interface จะประกาศแค่เมธอดที่ไม่มีการ implement (ไม่มี body) ซึ่งทำให้รายละเอียดการทำงานถูกซ่อนไว้ และบังคับให้คลาสลูกต้องนำเมธอดพวกนี้มา implement เอง โดยไม่ต้องใช้การ override

Abstraction ในภาษาอื่น ๆ

Java

สร้าง abstract class หรือ interface มาเป็นคลาสแม่แบบเช่นเดียวกับในภาษา C#

python

ทำ Abstraction ผ่านการใช้ ABC module ซึ่งทำงานคล้ายกับ abstract class และ interface โดยใช้ @abstractmethod decorator เพื่อกำหนดเมธอดเป็น abstract method เมธอดจะไม่มี implementation แต่จะใส่คีย์เวิร์ด pass ให้เข้าใจว่าคลาสลูกต้องนำไป override method เพื่อทำ implement เมธอด

C++

  1. abstract class คล้าย ๆ กับภาษาอื่น แต่ในภาษา C++ ไม่มีคีย์เวิร์ด abstract โดยตรง เราจะทราบได้ว่ามันเป็น abstract class ก็ต่อเมื่อในคลาสนั้นมี pure virtual function อย่างน้อยหนึ่งฟังก์ชัน ซึ่ง pure virtual function ก็คือ virtual function ที่เรากำหนดค่าให้มันเป็น 0 เพื่อบ่งว่าเป็น abstract method หรือเป็นเมธอดที่ไม่มี implementation

  2. data abstraction - ใช้ class: เพื่อจัดการรวมกลุ่มข้อมูลและเมธอด โดยใช้ access modifiers ซึ่งคลาสจะเป็นตัวกำหนดว่ามีข้อมูลหรือเมธอดไหนในคลาสที่จะเข้าถึงได้จากนอกคลาส และอ็อบเจกต์เรียกใช้เมธอดไหนได้บ้าง - ใช้ header file: เช่น เมธอด pow() ที่ใช้สำหรับคำนวณค่าพลังงานอยู่ในไฟล์ math.h ถ้าเราต้องการใช้งานเมธอดนี้ เราสามารถส่งค่าผ่าน arguments เพื่อให้เมธอดนำไปคำนวณ โดยไม่จำเป็นต้องรู้รายละเอียดการคำนวณภายในเลย - ใช้ Access Specifiers: ข้อมูลและเมธอดที่ถูกกำหนดให้เป็น public สามารถเข้าถึงได้จากภายนอกคลาส ในขณะที่ข้อมูลและเมธอดที่ถูกกำหนดเป็น private จะสามารถใช้งานได้เฉพาะในคลาสเดียวกันเท่านั้น

ตัวอย่างการทำ Abstraction ในแต่ละภาษา

// Abstract class
abstract class Sunstar {
    // Abstract method
    abstract void printInfo();
}

class Employee extends Sunstar {
    void printInfo() {
        String name = "avinash";
        int age = 21;
        float salary = 222.2F;
        
        System.out.println(name);
        System.out.println(age);
        System.out.println(salary);
    }
}

public class Main {
    public static void main(String args[]) {
        Sunstar s = new Employee();
        s.printInfo();
    }
}

ประโยชน์ของ Abstraction

  • ลดความซับซ้อนให้มองเห็นภาพรวมของการทำงานของอ็อบเจกต์

  • ลดการเขียนโค้ดซ้ำและสนับสนุนให้นำโค้ดกลับมาใช้ซ้ำ

  • ช่วยเพิ่มความปลอดภัยให้โปรแกรมเราโดยการซ่อนรายละเอียดการทำงานช่วยป้องกันการเข้าถึงข้อมูลสำคัญและลดความเสี่ยงในการเปลี่ยนแปลงข้อมูลที่ไม่ได้รับอนุญาต

สรุป

  • Abstraction เป็นหนึ่งในหลักการของ OOP ซึ่งช่วยในการซ่อนรายละเอียดการทำงานที่ซับซ้อน และแสดงเฉพาะส่วนที่ผู้ใช้จำเป็นต้องรู้หรือใช้งาน

  • ในภาษา C# การทำ Abstraction สามารถทำได้สองวิธีหลัก คือการใช้ abstract class หรือ interface

  • ภาษาอื่น ๆ ที่รองรับการทำ Abstraction เช่น Java, Python, หรือ C++ ใช้หลักการคล้ายกัน คือ สร้างคลาสที่มี abstract method ไว้เพื่อให้คลาสลูกนำไป implement

สื่อการสอนเพิ่มเติม

Slide

Reference

นิยามของ Abstraction

การทำ Abstraction ในภาษา C#

Javatpoint. (n.d.). C# abstract. Javatpoint. https://www.javatpoint.com/c-sharp-abstract

abstract class vs interface

GeeksforGeeks. (2023, May 17). Difference between abstract class and interface in C#. GeeksforGeeks. https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/

การทำ Abstraction ในภาษา Java

W3Schools. (n.d.). Java abstract classes. W3Schools. https://www.w3schools.com/java/java_abstract.asp

การทำ Abstraction ในภาษา Python

Tutorialspoint. (n.d.). Python abstraction. Tutorialspoint. https://www.tutorialspoint.com/python/python_abstraction.htm

superauu. (2021, January 7). Python interface. PIXELCRAFTDEV WEBDEVELOPMENT. https://supapongai.com/python-interface/

การทำ Abstraction ในภาษา C++

Javatpoint. (n.d.). Data abstraction in C++. Javatpoint. https://www.javatpoint.com/data-abstraction-in-cpp

Javatpoint. (n.d.). Interfaces in C++. Javatpoint. https://www.javatpoint.com/interfaces-in-cpp

GeeksforGeeks. (2024, October 11). Abstraction in C++. GeeksforGeeks. https://www.geeksforgeeks.org/abstraction-in-cpp/

ประโยชน์ของการทำ Abstraction

GeeksforGeeks. (2023, April 13). C# - Abstraction. GeeksforGeeks.https://www.geeksforgeeks.org/c-sharp-abstraction/

Last updated