Skip to Content
Javaการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming)การซ่อนรายละเอียดและอินเทอร์เฟซ (Abstraction & Interface)

การซ่อนรายละเอียด (Abstraction) และอินเทอร์เฟซ (Interface)

วันนี้เราจะมาเรียนรู้เกี่ยวกับแนวคิดสำคัญในการเขียนโปรแกรมเชิงวัตถุ (OOP) นั่นคือ การซ่อนรายละเอียด (Abstraction) และอินเทอร์เฟซ (Interface) กัน

การซ่อนรายละเอียด (Abstraction) คืออะไร?

การซ่อนรายละเอียดเป็นแนวคิดในการซ่อนความซับซ้อนภายในและแสดงเฉพาะส่วนที่จำเป็นต่อการใช้งาน เปรียบเสมือนการขับรถยนต์ - คุณไม่จำเป็นต้องรู้ว่าเครื่องยนต์ทำงานอย่างไร คุณเพียงแค่ใช้พวงมาลัย คันเร่ง และเบรกเท่านั้น 🚗

วิธีใช้ Abstraction

  1. Abstract Classes:
  • เป็นคลาสที่ไม่สามารถสร้างอินสแตนซ์ได้โดยตรง
  • สามารถมีทั้งเมธอดปกติและ abstract methods
abstract class สัตว์ { abstract void ร้อง(); // abstract method void กิน() { System.out.println("สัตว์กำลังกิน"); } } class สุนัข extends สัตว์ { void ร้อง() { System.out.println("โฮ่ง! โฮ่ง!"); } }
  1. Abstract Methods:
  • เป็นเมธอดที่ประกาศไว้แต่ไม่มีการกำหนดการทำงาน
  • คลาสลูกต้อง implement เมธอดนี้

อินเทอร์เฟซ (Interface) คืออะไร?

อินเทอร์เฟซเป็นเหมือน “สัญญา” ที่คลาสต้องปฏิบัติตาม กำหนดว่าคลาสควรมีเมธอดอะไรบ้าง แต่ไม่กำหนดว่าเมธอดนั้นทำงานอย่างไร เปรียบเสมือนเมนูอาหาร - บอกว่ามีอาหารอะไรบ้าง แต่ไม่บอกวิธีทำ 🍽️

วิธีใช้ Interface

interface ว่ายน้ำได้ { void ว่ายน้ำ(); } interface บินได้ { void บิน(); } class เป็ด implements ว่ายน้ำได้, บินได้ { public void ว่ายน้ำ() { System.out.println("เป็ดกำลังว่ายน้ำ"); } public void บิน() { System.out.println("เป็ดกำลังบิน"); } }

ข้อแตกต่างระหว่าง Abstract Class และ Interface

  1. การสืบทอด:
  • คลาสสามารถสืบทอดจาก abstract class ได้เพียงหนึ่งคลาส
  • คลาสสามารถ implement ได้หลาย interface
  1. เมธอด:
  • Abstract class สามารถมีทั้งเมธอดปกติและ abstract methods
  • Interface (ก่อน Java 8) มีแค่ abstract methods เท่านั้น
  1. ตัวแปร:
  • Abstract class สามารถมีตัวแปรแบบ non-final
  • Interface มีแค่ตัวแปร static final (constants) เท่านั้น

ตัวอย่างการใช้งานจริง

ลองมาดูตัวอย่างการใช้ Abstraction และ Interface ในการออกแบบระบบจัดการพนักงานกัน:

abstract class พนักงาน { protected String ชื่อ; protected double เงินเดือนพื้นฐาน; public พนักงาน(String ชื่อ, double เงินเดือนพื้นฐาน) { this.ชื่อ = ชื่อ; this.เงินเดือนพื้นฐาน = เงินเดือนพื้นฐาน; } abstract double คำนวณเงินเดือน(); public void แสดงข้อมูล() { System.out.println("ชื่อ: " + ชื่อ); System.out.println("เงินเดือน: " + คำนวณเงินเดือน()); } } interface ได้โบนัส { double คำนวณโบนัส(); } class พนักงานประจำ extends พนักงาน implements ได้โบนัส { public พนักงานประจำ(String ชื่อ, double เงินเดือนพื้นฐาน) { super(ชื่อ, เงินเดือนพื้นฐาน); } @Override double คำนวณเงินเดือน() { return เงินเดือนพื้นฐาน + คำนวณโบนัส(); } @Override public double คำนวณโบนัส() { return เงินเดือนพื้นฐาน * 0.1; // โบนัส 10% } } class พนักงานชั่วคราว extends พนักงาน { private int จำนวนชั่วโมงทำงาน; public พนักงานชั่วคราว(String ชื่อ, double เงินเดือนพื้นฐาน, int จำนวนชั่วโมงทำงาน) { super(ชื่อ, เงินเดือนพื้นฐาน); this.จำนวนชั่วโมงทำงาน = จำนวนชั่วโมงทำงาน; } @Override double คำนวณเงินเดือน() { return เงินเดือนพื้นฐาน * จำนวนชั่วโมงทำงาน / 160; // สมมติว่าทำงานเต็มเวลา 160 ชั่วโมงต่อเดือน } } public class ระบบจัดการพนักงาน { public static void main(String[] args) { พนักงาน[] พนักงานทั้งหมด = new พนักงาน[2]; พนักงานทั้งหมด[0] = new พนักงานประจำ("สมชาย", 30000); พนักงานทั้งหมด[1] = new พนักงานชั่วคราว("สมหญิง", 200, 120); for (พนักงาน พ : พนักงานทั้งหมด) { พ.แสดงข้อมูล(); System.out.println("--------------------"); } } }

สรุป

การซ่อนรายละเอียด (Abstraction) และอินเทอร์เฟซ (Interface) เป็นเครื่องมือสำคัญในการออกแบบโปรแกรมเชิงวัตถุ ช่วยให้เราสร้างโค้ดที่:

  • มีโครงสร้างที่ดี และเป็นระเบียบ
  • ยืดหยุ่นและขยายได้ง่าย
  • ง่ายต่อการบำรุงรักษาและแก้ไข

การใช้ Abstraction และ Interface อย่างเหมาะสมจะช่วยยกระดับคุณภาพของโค้ดและทำให้การพัฒนาโปรแกรมขนาดใหญ่เป็นไปอย่างมีประสิทธิภาพ

ปรับปรุงล่าสุด