การซ่อนรายละเอียด (Abstraction) และอินเทอร์เฟซ (Interface)
วันนี้เราจะมาเรียนรู้เกี่ยวกับแนวคิดสำคัญในการเขียนโปรแกรมเชิงวัตถุ (OOP) นั่นคือ การซ่อนรายละเอียด (Abstraction) และอินเทอร์เฟซ (Interface) กัน
การซ่อนรายละเอียด (Abstraction) คืออะไร?
การซ่อนรายละเอียดเป็นแนวคิดในการซ่อนความซับซ้อนภายในและแสดงเฉพาะส่วนที่จำเป็นต่อการใช้งาน เปรียบเสมือนการขับรถยนต์ - คุณไม่จำเป็นต้องรู้ว่าเครื่องยนต์ทำงานอย่างไร คุณเพียงแค่ใช้พวงมาลัย คันเร่ง และเบรกเท่านั้น 🚗
วิธีใช้ Abstraction
- Abstract Classes:
- เป็นคลาสที่ไม่สามารถสร้างอินสแตนซ์ได้โดยตรง
- สามารถมีทั้งเมธอดปกติและ abstract methods
abstract class สัตว์ {
abstract void ร้อง(); // abstract method
void กิน() {
System.out.println("สัตว์กำลังกิน");
}
}
class สุนัข extends สัตว์ {
void ร้อง() {
System.out.println("โฮ่ง! โฮ่ง!");
}
}- Abstract Methods:
- เป็นเมธอดที่ประกาศไว้แต่ไม่มีการกำหนดการทำงาน
- คลาสลูกต้อง implement เมธอดนี้
อินเทอร์เฟซ (Interface) คืออะไร?
อินเทอร์เฟซเป็นเหมือน “สัญญา” ที่คลาสต้องปฏิบัติตาม กำหนดว่าคลาสควรมีเมธอดอะไรบ้าง แต่ไม่กำหนดว่าเมธอดนั้นทำงานอย่างไร เปรียบเสมือนเมนูอาหาร - บอกว่ามีอาหารอะไรบ้าง แต่ไม่บอกวิธีทำ 🍽️
วิธีใช้ Interface
interface ว่ายน้ำได้ {
void ว่ายน้ำ();
}
interface บินได้ {
void บิน();
}
class เป็ด implements ว่ายน้ำได้, บินได้ {
public void ว่ายน้ำ() {
System.out.println("เป็ดกำลังว่ายน้ำ");
}
public void บิน() {
System.out.println("เป็ดกำลังบิน");
}
}ข้อแตกต่างระหว่าง Abstract Class และ Interface
- การสืบทอด:
- คลาสสามารถสืบทอดจาก abstract class ได้เพียงหนึ่งคลาส
- คลาสสามารถ implement ได้หลาย interface
- เมธอด:
- Abstract class สามารถมีทั้งเมธอดปกติและ abstract methods
- Interface (ก่อน Java 8) มีแค่ abstract methods เท่านั้น
- ตัวแปร:
- 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 อย่างเหมาะสมจะช่วยยกระดับคุณภาพของโค้ดและทำให้การพัฒนาโปรแกรมขนาดใหญ่เป็นไปอย่างมีประสิทธิภาพ