Training

Inheritance คืออะไร

25 Jun 2013

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 อีกทีหนึ่ง

รูปที่6: Single Inheritance

จากรูปข้างต้น เราสามารถพูดได้ดังนี้

  • 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 ตามลำดับ

ตัวอย่างที่ 4: Address.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
ตัวอย่างที่ 5: Employee.java
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
ตัวอย่างที่ 6: Manager.java
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
ตัวอย่างที่ 7: TestEmployee.java
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 ครับ ตามอ่านต่อกันในโอกาสหน้านะครับ บาย


Books By Me

JavaScript Programming Guide book cover

JavaScript Programming Guide
Thai language
Kontentblue Publishing

About This Site

I use this site to share my knowledge in form of articles. I also use it as an experimental space, trying and testing things. If you have any problems viewing this site, please tell me.

→ More about me

→ Contact me

→ Me on facebook

Creative Commons Attribution License

creative commons logo

This license lets you distribute, remix, tweak my articles, even commercially, as long as you credit me for the original creation.

ด้วยสัญญาอนุญาตินี้ คุณสามารถเผยแพร่ ดัดแปลง แก้ไขและนำบทความของผมไปใช้ แม้ในเชิงธุรกิจ ตราบใดที่คุณได้อ้างอิงกลับมาและให้เครดิตกับผม