การสืบทอด (Inheritance)
วันนี้เรามาเรียนรู้เกี่ยวกับการสืบทอด (Inheritance) ซึ่งเป็นหนึ่งในแนวคิดสำคัญของการเขียนโปรแกรมเชิงวัตถุ (OOP) ใน Java กัน
การสืบทอดคืออะไร?
การสืบทอดเป็นกระบวนการที่คลาสหนึ่ง (เรียกว่าคลาสลูก หรือ subclass) สามารถรับคุณสมบัติและพฤติกรรมจากอีกคลาสหนึ่ง (เรียกว่าคลาสแม่ หรือ superclass) ได้
ลองนึกภาพครอบครัว: ลูกๆ มักจะได้รับลักษณะบางอย่างจากพ่อแม่ แต่ก็อาจมีลักษณะเฉพาะตัวด้วย 👨👩👧👦
ทำไมการสืบทอดถึงสำคัญ?
- ลดการเขียนโค้ดซ้ำซ้อน
- ทำให้โค้ดนำกลับมาใช้ใหม่ได้ง่าย
- สร้างโครงสร้างที่เป็นลำดับชั้นของคลาส
- ทำให้การขยายฟังก์ชันการทำงานทำได้ง่ายขึ้น
วิธีใช้การสืบทอด
ใน Java เราใช้คำสำคัญ extends เพื่อสร้างการสืบทอด:
public class คลาสลูก extends คลาสแม่ {
// เนื้อหาของคลาสลูก
}ตัวอย่างการสืบทอด
มาดูตัวอย่างการสืบทอดโดยใช้สัตว์เป็นตัวอย่างกัน:
// คลาสแม่
public class สัตว์ {
protected String ชื่อ;
protected int อายุ;
public void กิน() {
System.out.println(ชื่อ + " กำลังกินอาหาร");
}
public void หลับ() {
System.out.println(ชื่อ + " กำลังนอนหลับ");
}
}
// คลาสลูก
public class สุนัข extends สัตว์ {
public void เห่า() {
System.out.println(ชื่อ + " กำลังเห่า: โฮ่ง! โฮ่ง!");
}
}
// คลาสลูกอีกตัว
public class แมว extends สัตว์ {
public void ร้องเหมียว() {
System.out.println(ชื่อ + " กำลังร้อง: เหมียว! เหมียว!");
}
}ในตัวอย่างนี้:
สัตว์เป็นคลาสแม่สุนัขและแมวเป็นคลาสลูกที่สืบทอดจากสัตว์- คลาสลูกจะได้รับคุณสมบัติ (
ชื่อ,อายุ) และเมธอด (กิน(),หลับ()) จากคลาสแม่ - คลาสลูกยังสามารถมีเมธอดเฉพาะของตัวเองได้ (
เห่า()สำหรับสุนัข,ร้องเหมียว()สำหรับแมว)
การใช้งานคลาสที่สืบทอด
public class โปรแกรมสัตว์เลี้ยง {
public static void main(String[] args) {
สุนัข บูลด็อก = new สุนัข();
บูลด็อก.ชื่อ = "น้องหมา";
บูลด็อก.อายุ = 3;
แมว เปอร์เซีย = new แมว();
เปอร์เซีย.ชื่อ = "น้องแมว";
เปอร์เซีย.อายุ = 2;
บูลด็อก.กิน(); // เมธอดจากคลาสแม่
บูลด็อก.เห่า(); // เมธอดเฉพาะของสุนัข
เปอร์เซีย.หลับ(); // เมธอดจากคลาสแม่
เปอร์เซีย.ร้องเหมียว(); // เมธอดเฉพาะของแมว
}
}การ Override เมธอด
บางครั้ง คลาสลูกอาจต้องการเปลี่ยนแปลงพฤติกรรมที่ได้รับมาจากคลาสแม่ เราเรียกสิ่งนี้ว่าการ Override:
public class แมว extends สัตว์ {
@Override
public void กิน() {
System.out.println(ชื่อ + " กำลังกินปลาทูน่า อร่อยจัง!");
}
public void ร้องเหมียว() {
System.out.println(ชื่อ + " กำลังร้อง: เหมียว! เหมียว!");
}
}ในตัวอย่างนี้ เมธอด กิน() ของแมวถูก override เพื่อให้แสดงข้อความที่เฉพาะเจาะจงมากขึ้น
คำสำคัญ super
คำสำคัญ super ใช้เพื่อเรียกเมธอดหรือคอนสตรักเตอร์ของคลาสแม่:
public class สุนัข extends สัตว์ {
public สุนัข(String ชื่อ, int อายุ) {
super.ชื่อ = ชื่อ;
super.อายุ = อายุ;
}
@Override
public void กิน() {
super.กิน(); // เรียกเมธอด กิน() ของคลาสแม่ก่อน
System.out.println("และกำลังแทะกระดูกด้วย!");
}
}ข้อควรระวังเกี่ยวกับการสืบทอด
- Java ไม่สนับสนุนการสืบทอดแบบหลายคลาสแม่ (multiple inheritance) โดยตรง
- ใช้การสืบทอดเมื่อมีความสัมพันธ์แบบ “is-a” เท่านั้น (เช่น สุนัข “is-a” สัตว์)
- หากใช้การสืบทอดมากเกินไป อาจทำให้โค้ดซับซ้อนและยากต่อการบำรุงรักษา
ตัวอย่างการใช้งานจริง
ลองมาสร้างระบบจัดการพนักงานง่ายๆ โดยใช้การสืบทอดกัน:
public class พนักงาน {
protected String ชื่อ;
protected double เงินเดือนพื้นฐาน;
public พนักงาน(String ชื่อ, double เงินเดือนพื้นฐาน) {
this.ชื่อ = ชื่อ;
this.เงินเดือนพื้นฐาน = เงินเดือนพื้นฐาน;
}
public void แสดงข้อมูล() {
System.out.println("ชื่อ: " + ชื่อ);
System.out.println("เงินเดือนพื้นฐาน: " + เงินเดือนพื้นฐาน);
}
public double คำนวณเงินเดือน() {
return เงินเดือนพื้นฐาน;
}
}
public class พนักงานขาย extends พนักงาน {
private double ยอดขาย;
private double เปอร์เซ็นต์คอมมิชชั่น;
public พนักงานขาย(String ชื่อ, double เงินเดือนพื้นฐาน, double ยอดขาย, double เปอร์เซ็นต์คอมมิชชั่น) {
super(ชื่อ, เงินเดือนพื้นฐาน);
this.ยอดขาย = ยอดขาย;
this.เปอร์เซ็นต์คอมมิชชั่น = เปอร์เซ็นต์คอมมิชชั่น;
}
@Override
public void แสดงข้อมูล() {
super.แสดงข้อมูล();
System.out.println("ยอดขาย: " + ยอดขาย);
System.out.println("เปอร์เซ็นต์คอมมิชชั่น: " + (เปอร์เซ็นต์คอมมิชชั่น * 100) + "%");
}
@Override
public double คำนวณเงินเดือน() {
return super.คำนวณเงินเดือน() + (ยอดขาย * เปอร์เซ็นต์คอมมิชชั่น);
}
}
public class โปรแกรมจัดการพนักงาน {
public static void main(String[] args) {
พนักงาน พนักงานทั่วไป = new พนักงาน("สมชาย", 15000);
พนักงานขาย พนักงานขาย = new พนักงานขาย("สมหญิง", 15000, 100000, 0.05);
System.out.println("ข้อมูลพนักงานทั่วไป:");
พนักงานทั่วไป.แสดงข้อมูล();
System.out.println("เงินเดือนรวม: " + พนักงานทั่วไป.คำนวณเงินเดือน());
System.out.println("\nข้อมูลพนักงานขาย:");
พนักงานขาย.แสดงข้อมูล();
System.out.println("เงินเดือนรวม: " + พนักงานขาย.คำนวณเงินเดือน());
}
}สรุป
การสืบทอดเป็นแนวคิดที่ทรงพลังใน OOP ช่วยให้เราสร้างโครงสร้างโปรแกรมที่เป็นลำดับชั้น ลดการเขียนโค้ดซ้ำซ้อน และทำให้การขยายฟังก์ชันการทำงานทำได้ง่ายขึ้น การเข้าใจและใช้การสืบทอดอย่างเหมาะสมจะช่วยให้คุณสามารถออกแบบและเขียนโปรแกรมที่มีประสิทธิภาพและยืดหยุ่นมากขึ้น