Inheritance คืออะไร
Single Inheritance
ฟีเจอร์ Inheritance นั้นบางภาษาก็รองรับแบบ Single Inheritance บางภาษาก็รองรับแบบ Multiple Inheritance นะครับ Java จะใช้แบบ Single Inheritance นั่นก็คือคลาสใดๆก็ตามจะมีได้เพียงหนึ่ง Super-class เท่านั้น หรือว่าห้าม extends
ทีละหลายๆตัวครับ ทั้งนี้ทั้งนั้นเพื่อป้องกันความสับสนใน Sub-class (บางที่รับถ่ายทอดมาจากหลายๆคลาส มันก็มาขัดแย้งกันใน Sub-class ได้) แต่ Java ใช้ Interface เข้ามาทดแทนให้ (รายละเอียดยังไม่พูดถึงในบทความนี้นะครับ) อย่างไรก็ตามการทำ Inheritance ไม่ได้จำกัดว่าจะต้องทำเพียง Level เดียว ลองดูตัวอย่างในรูปที่ 6 ดู จะเห็นได้ว่า Director extends
ออกมาจาก Manager
อีกที ดังนั้นคุณสมบัติที่มีใน Employee
และ Manager
ก็จะถูกถ่ายทอดมายัง Director
ด้วย การออกแบบลักษณะเช่นนี้หมายความว่า Director
เป็นอะไรที่เฉพาะเจาะจงลงไปจาก Manager
อีกทีหนึ่ง
จากรูปข้างต้น เราสามารถพูดได้ดังนี้
- A sales is-an employee
- A programmer is-an employee
- A manager is-an employee
- A director is-a manager
- A director is-an employee
แต่ไม่ใช่ต่อไปนี้
- An employee is-not-a manager
- A sales is-not-a manager
Putting It All Together
ในหัวข้อนี้ผมจะมาสรุปรวมโค้ดทั้งหมดที่เราได้เรียนรู้กันมาเพื่อกันความสับสน อ้อ ถ้าใครใช้วิธีคอมไพล์และรันผ่าน Command-line ก็อย่าลืมทำกันให้ถูกวิธีนะครับ เพราะมีเรื่องของแพ็คเกจเข้ามาเกี่ยวข้องด้วย เดี๋ยวจะสงสัยกันว่าทำไมไม่ผ่าน ส่วนวิธีคอมไพล์และรันให้ถูกต้องนั้นผมขอไม่พูดในบทความนี้นะครับ ตัวอย่างที่ 4, 5, 6, 7 แสดงโค้ดตัวอย่างของ Address.java, Employee.java, Manager.java และ TestEmployee.java ตามลำดับ
package ems.model;
public class Address {
protected String street;
protected String city;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAddressInfo() {
return street + ", " + city;
} // end of gtAddressInfo()
} // end of class
package ems.model;
public class Employee {
protected int id;
protected String name;
protected double salary;
protected Address address = new Address();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getDetails() {
return (id + ", " + name + ", " + salary + ", "
+ address.getAddressInfo());
} // end of getDetails()
} // end of class
package ems.model;
public class Manager extends Employee{
protected String parkingNo;
public String getParkingNo() {
return parkingNo;
}
public void setParkingNo(String parkingNo) {
this.parkingNo = parkingNo;
}
public String getDetails(){
return (id + ", " + name + ", " + salary + ", "
+ address.getAddressInfo() +
", [Parking No: " + parkingNo + "]");
} // end of getDetials()
} // end of class
package ems.test;
import ems.model.Employee;
import ems.model.Manager;
public class TestEmployee {
public static void main(String[] args) {
Employee emp1 = new Employee();
emp1.setId(1);
emp1.setName("James");
emp1.setSalary(15000);
emp1.getAddress().setStreet("Rama 3");
emp1.getAddress().setCity("Bangkok");
System.out.println( emp1.getDetails() );
Employee emp2 = new Employee();
emp2.setId(2);
emp2.setName("Ann");
emp2.setSalary(25000);
emp2.getAddress().setStreet("Silom");
emp2.getAddress().setCity("Bangkok");
System.out.println( emp2.getDetails() );
Manager emp3 = new Manager();
emp3.setId(3);
emp3.setName("Peter");
emp3.setSalary(40000);
emp3.getAddress().setStreet("Bangrak");
emp3.getAddress().setCity("Bangkok");
emp3.setParkingNo("4C-19");
System.out.println( emp3.getDetails() );
} // end of main()
} // end class
สรุปปิดท้าย
จบแล้วนะครับกับเรื่องของ Inheritance ไม่ยากเกินไปใช่มั้ยครับ อันที่จริงยังมีรายละเอียดอื่นๆให้เขียนอีกพอสมควร แต่มันคงจะยาวเกินไปจนคุณขี้เกียจอ่านกัน ก็ลองไปหาอ่านเพิ่มเติมเอาในหนังสือหรือสื่อต่างๆดู แต่ผมอยากจะทิ้งท้ายเรื่องของ Inheritance ดังนี้ ประโยชน์ที่เราเห็นได้ชัดๆเลยจากการทำ Inheritance ก็คงหนีไม่พ้นเรื่องการนำโค้ดกลับมาใช้ใหม่ และเรื่องการปรับเปลี่ยนแก้ไขโค้ดที่ทำได้ง่ายขึ้น หมายความว่าอย่างไร? ก็หมายความว่าเราสามารถ extends
โค้ดที่มีอยู่ก่อนแล้วได้ ทำให้โค้ดแยกออกเป็นสัดเป็นส่วน เมื่อเกิดเหตุการณ์ที่ต้องแก้ไขโค้ดขึ้น ก็ทำเพียงที่เดียว เพราะเราไม่ได้เขียนโค้ดซ้ำๆกันในหลายๆที่ แล้วนอกจากประโยชน์ที่กล่าวไปแล้วคุณยังนึกอะไรเพิ่มเติมได้อีกหรือไม่ครับ??? ถ้าไม่ได้ผมว่าประโยชน์ของ Inheritance มันก็ดูงั้นๆครับ ไม่มีก็ไม่ตาย!!! อ้าว?!! จริงมั้ยหล่ะครับคุณลองนึกดู ถ้าประโยชน์มันมีแค่นี้ ผมขยันหน่อยกด Ctrl-c และ Ctrl-v ก๊อปแปะๆมันก็ได้นิครับ บางคนอาจจะว่าตอนเปลี่ยนแปลงแก้ไขมันปวดหัว ก็ใช่แต่ไม่ถึงกับตายหรอกให้ Tool มันช่วยค้นหาและแก้ไขก็ได้ โปรเจคหนึ่งเราทำกันเป็นปีๆเลย แค่ก๊อปปี้แปะไม่ถึงชั่วโมงมันก็เสร็จ เพราะฉะนั้นฟีเจอร์นี้มันก็ไม่ได้สำคัญขนาดที่จะขาดมันไปไม่ได้น่ะสิ ... ไม่เป็นไรไม่ต้องคิดกันให้ปวดหัวเครียดจนเกินไปครับ ผมเฉลยให้ว่าประโยชน์ที่แท้จริงของมันอยู่ที่มันทำให้เราใช้ฟีเจอร์ Polymorphismได้ด้วยครับ เพราะฉะนั้นถ้าเข้าไม่ถึง Polymorphism เราก็ยังเข้าไม่ถึง Inheritance ครับ ตามอ่านต่อกันในโอกาสหน้านะครับ บาย