6.2 การใช้คลาสนามธรรม (Abstract Class) และ Interface
6.2 การใช้คลาสนามธรรม (Abstract Class) และ Interface
1. คลาสนามธรรม (Abstract Class)
คลาสนามธรรม เป็นคลาสที่ไม่สามารถสร้างอ็อบเจกต์ได้โดยตรง แต่เป็นโครงสร้างที่ใช้เพื่อกำหนดพฤติกรรมหลักๆ ของคลาสย่อย คลาสนามธรรมสามารถมีทั้ง เมธอดธรรมดา (ที่มีการกำหนดรายละเอียดการทำงาน) และ เมธอดนามธรรม (ที่ไม่ได้กำหนดรายละเอียด) ซึ่งต้องถูกนำไปใช้ในคลาสย่อย
ลักษณะของคลาสนามธรรม (Abstract Class)
คลาสนี้อาจมีหรือไม่มีฟังก์ชันที่ทำงานสมบูรณ์แล้วก็ได้ (บางฟังก์ชันอาจยังเป็นนามธรรม)
มีทั้ง attributes และ methods ได้ตามปกติ
ใช้ในการกำหนดพฤติกรรมพื้นฐานที่คลาสลูกต้องการ แต่ยังยืดหยุ่นให้คลาสลูกปรับแต่งบางอย่างได้เอง
การใช้ Abstract Class เหมาะสำหรับ:
การกำหนดโครงสร้างพื้นฐานที่ต้องการให้คลาสย่อยมีเหมือนกัน
เมื่อมีเมธอดบางส่วนที่ต้องการการกำหนดการทำงานภายใน และบางส่วนต้องการการเขียนทับในคลาสย่อย
ตัวอย่าง (Java):
abstract class Animal {
abstract void sound(); // method ที่เป็นนามธรรม ไม่มีการทำงานที่สมบูรณ์
void breathe() { // method ที่มีการทำงานที่สมบูรณ์
System.out.println("Breathing...");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Barks");
}
}
Interface เป็นสัญญาที่ระบุว่าคลาสที่ implement ต้องมี method และ properties ตามที่กำหนดใน interface นั้น ๆ โดยทั่วไป method ใน Interface จะไม่มีการทำงานสมบูรณ์ (เป็น abstract method ทั้งหมด)
ลักษณะของInterface
ไม่มี state หรือ properties แบบคงที่ (ใน Java ใหม่ๆ สามารถมี default methods ที่มีการทำงานในตัวเองได้)
คลาสที่ implement interface สามารถสืบทอด interface ได้มากกว่า 1 ตัว (ทำให้เกิดความยืดหยุ่นในการใช้งาน)
ใช้เมื่ออยากกำหนดชุดพฤติกรรมที่คลาสต่าง ๆ ต้องทำตาม แต่ไม่สนใจว่าคลาสจะมีโครงสร้างภายในอย่างไร
ตัวอย่าง (Java):
interface AnimalActions {
void sound();
void eat();
}
class Cat implements AnimalActions {
@Override
public void sound() {
System.out.println("Meows");
}
@Override
public void eat() {
System.out.println("Eating...");
}
}
ใช้ Abstract Class เมื่อคลาสที่ต้องการสร้างต้องการโครงสร้างพื้นฐานบางส่วน และมีความสัมพันธ์ที่ชัดเจนกับคลาสลูก เช่น ความสัมพันธ์แบบ "is a" หรือ "เป็นชนิดหนึ่งของ"
ใช้ Interface เมื่ออยากให้หลายคลาสมีพฤติกรรมที่เหมือนกันโดยไม่มีข้อจำกัดเรื่องการสืบทอด