Skip to Content

การสืบทอด (Inheritance)

วันนี้เรามาเรียนรู้เกี่ยวกับการสืบทอด (Inheritance) ซึ่งเป็นหนึ่งในแนวคิดสำคัญของการเขียนโปรแกรมเชิงวัตถุ (OOP) ใน Java กัน

การสืบทอดคืออะไร?

การสืบทอดเป็นกระบวนการที่คลาสหนึ่ง (เรียกว่าคลาสลูก หรือ subclass) สามารถรับคุณสมบัติและพฤติกรรมจากอีกคลาสหนึ่ง (เรียกว่าคลาสแม่ หรือ superclass) ได้

ลองนึกภาพครอบครัว: ลูกๆ มักจะได้รับลักษณะบางอย่างจากพ่อแม่ แต่ก็อาจมีลักษณะเฉพาะตัวด้วย 👨‍👩‍👧‍👦

ทำไมการสืบทอดถึงสำคัญ?

  1. ลดการเขียนโค้ดซ้ำซ้อน
  2. ทำให้โค้ดนำกลับมาใช้ใหม่ได้ง่าย
  3. สร้างโครงสร้างที่เป็นลำดับชั้นของคลาส
  4. ทำให้การขยายฟังก์ชันการทำงานทำได้ง่ายขึ้น

วิธีใช้การสืบทอด

ใน 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("และกำลังแทะกระดูกด้วย!"); } }

ข้อควรระวังเกี่ยวกับการสืบทอด

  1. Java ไม่สนับสนุนการสืบทอดแบบหลายคลาสแม่ (multiple inheritance) โดยตรง
  2. ใช้การสืบทอดเมื่อมีความสัมพันธ์แบบ “is-a” เท่านั้น (เช่น สุนัข “is-a” สัตว์)
  3. หากใช้การสืบทอดมากเกินไป อาจทำให้โค้ดซับซ้อนและยากต่อการบำรุงรักษา

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

ลองมาสร้างระบบจัดการพนักงานง่ายๆ โดยใช้การสืบทอดกัน:

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 ช่วยให้เราสร้างโครงสร้างโปรแกรมที่เป็นลำดับชั้น ลดการเขียนโค้ดซ้ำซ้อน และทำให้การขยายฟังก์ชันการทำงานทำได้ง่ายขึ้น การเข้าใจและใช้การสืบทอดอย่างเหมาะสมจะช่วยให้คุณสามารถออกแบบและเขียนโปรแกรมที่มีประสิทธิภาพและยืดหยุ่นมากขึ้น

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