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
จากโค้ด เราสร้างคลาส 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
จากโค้ดนี้ 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++
abstract class คล้าย ๆ กับภาษาอื่น แต่ในภาษา C++ ไม่มีคีย์เวิร์ด abstract โดยตรง เราจะทราบได้ว่ามันเป็น abstract class ก็ต่อเมื่อในคลาสนั้นมี pure virtual function อย่างน้อยหนึ่งฟังก์ชัน ซึ่ง pure virtual function ก็คือ virtual function ที่เรากำหนดค่าให้มันเป็น 0 เพื่อบ่งว่าเป็น abstract method หรือเป็นเมธอดที่ไม่มี implementation
data abstraction - ใช้ class: เพื่อจัดการรวมกลุ่มข้อมูลและเมธอด โดยใช้ access modifiers ซึ่งคลาสจะเป็นตัวกำหนดว่ามีข้อมูลหรือเมธอดไหนในคลาสที่จะเข้าถึงได้จากนอกคลาส และอ็อบเจกต์เรียกใช้เมธอดไหนได้บ้าง - ใช้ header file: เช่น เมธอด pow() ที่ใช้สำหรับคำนวณค่าพลังงานอยู่ในไฟล์ math.h ถ้าเราต้องการใช้งานเมธอดนี้ เราสามารถส่งค่าผ่าน arguments เพื่อให้เมธอดนำไปคำนวณ โดยไม่จำเป็นต้องรู้รายละเอียดการคำนวณภายในเลย - ใช้ Access Specifiers: ข้อมูลและเมธอดที่ถูกกำหนดให้เป็น public สามารถเข้าถึงได้จากภายนอกคลาส ในขณะที่ข้อมูลและเมธอดที่ถูกกำหนดเป็น private จะสามารถใช้งานได้เฉพาะในคลาสเดียวกันเท่านั้น
ตัวอย่างการทำ Abstraction ในแต่ละภาษา
ประโยชน์ของ Abstraction
ลดความซับซ้อนให้มองเห็นภาพรวมของการทำงานของอ็อบเจกต์
ลดการเขียนโค้ดซ้ำและสนับสนุนให้นำโค้ดกลับมาใช้ซ้ำ
ช่วยเพิ่มความปลอดภัยให้โปรแกรมเราโดยการซ่อนรายละเอียดการทำงานช่วยป้องกันการเข้าถึงข้อมูลสำคัญและลดความเสี่ยงในการเปลี่ยนแปลงข้อมูลที่ไม่ได้รับอนุญาต
สรุป
Abstraction เป็นหนึ่งในหลักการของ OOP ซึ่งช่วยในการซ่อนรายละเอียดการทำงานที่ซับซ้อน และแสดงเฉพาะส่วนที่ผู้ใช้จำเป็นต้องรู้หรือใช้งาน
ในภาษา C# การทำ Abstraction สามารถทำได้สองวิธีหลัก คือการใช้ abstract class หรือ interface
ภาษาอื่น ๆ ที่รองรับการทำ Abstraction เช่น Java, Python, หรือ C++ ใช้หลักการคล้ายกัน คือ สร้างคลาสที่มี abstract method ไว้เพื่อให้คลาสลูกนำไป implement
สื่อการสอนเพิ่มเติม
Slide
Reference
นิยามของ Abstraction
borntoDev. (2020, April 14). OOP จากตัวอย่างที่ง่ายๆ. borntoDev. https://www.borntodev.com/2020/04/14/oop-%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B9%86/
การทำ 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