Inheritance and Encapsulation Chapter 3 Inheritance and Encapsulation
ความหมายของ Inheritance การสร้างหรือพัฒนาคลาสใหม่จากคลาสเดิมที่มีอยู่ แล้ว คลาสใหม่จะนำแอตทริบิวต์และเมธอดของคลาส เดิมมาใช้ เป็นการถ่ายทอดคุณสมบัติจากคลาสหนึ่งสู่อีก คลาสหนึ่งนั่นเอง เรียกคลาสที่ถ่ายทอดคุณสมบัติของคลาสว่า คลาสแม่ (Superclass) เรียกคลาสที่ได้รับการถ่ายทอดว่า คลาสลูก (Subclass) คลาสลูกสามารถพัฒนาต่อเติมแอตทริบิวต์และเมธ อดของตัวเองได้ คลาสลูกสามารถปรับปรุงแก้ไขแอตทริบิวต์และ เมธอดเดิมที่ได้รับ มาจากคลาสแม่ได้
ตัวอย่างการสร้างคลาสแม่ - คลาสลูก คลาส Car เป็นคลาสรถทั่วไปที่มี สามารถ สตาร์ทเครื่องได้ – start() เปลี่ยนเกียร์ได้ – ChangeGear() ดับเครื่องได้ – stop() คลาส Bus เป็นคลาสรถบัสที่มี สามารถ สตาร์ทเครื่องได้ เปลี่ยนเกียร์ได้ ดับ เครื่องได้ มีผู้โดยสาร - Seat
ตัวอย่างการสร้างคลาสแม่ - คลาสลูก ดังนั้น คลาส Car เป็นคลาสแม่ และ คลาส Bus เป็นคลาสลูกที่สืบทอด คุณสมบัติจากคลาส Car
รู้จักกับคลาสแม่ (Superclass) เป็นคลาสที่เป็นต้นแบบของแอตทริบิวต์และเมธอด อนุญาตให้คลาสอื่นสืบทอดแอตทริบิวต์และเมธอดไป ได้ทั้งหมด ยกเว้นแอตทริบิวต์ที่มีระดับการเข้าถึงเป็น private และ เมธอดที่เป็น constructor ระดับการเข้าถึงแอตทริบิวต์และเมธอดของคลาสแม่ เป็น protected มีรูปแบบการใช้งาน ดังนี้ [modifier] class SuperClassName { [AttributeName] [MethodName] }
รู้จักกับคลาสแม่ (SuperClass) โดยที่ modifier เป็นคีย์เวิร์ดที่กำหนดคุณสมบัติการเข้าถึงคลาส SuperClassName เป็นชื่อคลาสแม่ AttributeName เป็นส่วนของการประกาศแอตทริบิวต์ MethodName เป็นส่วนของการประกาศเมธอด
รู้จักกับคลาสลูก (SubClass) เป็นคลาสที่สืบทอดแอตทริบิวต์และเมธอดจาก คลาสแม่ คลาสลูกสามารถเรียกใช้แอตทริบิวต์และเมธอด จากคลาสแม่ได้ และคลาสลูกมีแอตทริบิวต์และเมธอดเพิ่มเติม เป็นของตัวเองได้ การระบุความสัมพันธ์ให้คลาสเป็นคลาสลูกต้อง ใช้คีย์เวิร์ด extends มีรูปแบบการใช้งาน ดังนี้ [modifier] class SubClassName extends SuperClassName { [AttributeName] [MethodName] }
รู้จักกับคลาสลูก (SubClass) โดยที่ modifier เป็นคีย์เวิร์ดที่กำหนดคุณสมบัติการเข้าถึงคลาส SubClassName เป็นชื่อคลาสลูก SuperClassName เป็นชื่อคลาสแม่ AttributeName เป็นส่วนของการประกาศแอตทริบิวต์ MethodName เป็นส่วนของการประกาศเมธอด
โปรแกรมกำหนดค่าแรงรายวัน ให้กับคลาสแม่-คลาสลูก import java.util.Scanner; class employee { protected float rate=300.0f; } class daily_emp extends employee { } class monthly_emp extends employee {
โปรแกรมกำหนดค่าแรงรายวันให้กับคลาสแม่-คลาสลูก public class SupSubClassTest { public static void main(String[] args) { float r; employee emp1 = new employee(); System.out.println("\"Employee\"\nRate per Day=" +emp1.rate+"BAHT"); Scanner scan = new Scanner(System.in); System.out.print("\"Daily Employee\"\nEnter Rate = "); r = scan.nextFloat(); daily_emp emp2 = new daily_emp(); emp2.rate = r; System.out.println("Rate per Day = " + emp2.rate + " BAHT"); System.out.print("\"Monthly Employee\"\nEnter Salary : "); monthly_emp emp3 = new monthly_emp(); emp3.rate = r; System.out.println("Rate per Day = " + emp3.rate/30 +" BAHT"); }
รู้จักกับ Overriding method ที่สืบทอดมาจากคลาสแม่ เมธอดในคลาสลูกจะมีชื่อเมธอด, ชนิดข้อมูลที่คืนค่า, จำนวนและชนิดข้อมูลของอาร์กิวเมนต์ที่เหมือนกับ คลาสแม่ สามารถพัฒนาเมธอดให้มีการทำงานในเรื่องเดียวกัน แต่แตกต่างกัน ในรายละเอียดของการทำงาน เช่น การคำนวณหาพื้นที่ของรูปทรงเรขาคณิตต่าง ๆ ที่มีสูตร คำนวณที่แตกต่างกัน การคำนวณค่าแรงของพนักงานที่มีวิธีคำนวณที่แตกต่างกัน ไปในแต่ละตำแหน่ง
โปรแกรมคำนวณค่าแรงรวม Override เมธอด calOT() class daily_emp extends employee { } class monthly_emp extends employee { float pay, bonus; float calOT() { pay = hour*rate/work; if (hour>100) pay += bonus; return pay; import java.util.Scanner; class employee { protected float rate = 300.0f, work=10.0f; int hour; float calOT() { return hour*rate/work; }
โปรแกรมคำนวณค่าแรงรวม Override เมธอด calOT() public class InheritOverRideTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("Enter total OT hour : "); employee emp1 = new employee(); emp1.hour = scan.nextInt(); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp1.rate + " * " + emp1.hour + ") = " + emp1.calOT() + " BAHT"); daily_emp emp2 = new daily_emp(); emp2.hour = emp1.hour; System.out.print("\"Daily Employee\"\nRate per Day = "); emp2.rate = scan.nextFloat(); System.out.println("Total OT Pay = (" + emp2.rate + " * " + emp2.hour + ") = " + emp2.calOT()+ " BAHT");
โปรแกรมคำนวณค่าแรงรวม Override เมธอด calOT() monthly_emp emp3 = new monthly_emp(); emp3.hour = emp1.hour; System.out.print("\"Monthly Employee\"\nEnter Salary = "); emp3.rate = scan.nextFloat()/30; System.out.print("Enter Bonus = "); emp3.bonus = scan.nextFloat(); System.out.println("Total OT Pay = (" + emp3.rate + " * " + emp3.hour + ") + " + emp3.bonus + " = " + emp3.calOT() + " BAHT"); }
รู้จักกับ Overload Constructor โดยใช้คีย์เวิร์ด super จึงสามารถทำ overload constructor ใน คลาสแม่ได้ตามปกติ
โปรแกรมคำนวณค่าแรงรวม Overload Constructor public employee(int h, float r) { pay = h*r/work; } public employee(int h, float r, float b) { this(h,r); if (h>100) pay += b; } import java.util.Scanner; class employee { protected float rate = 300.0f, work=10.0f, pay; public employee(int h) { pay = h*rate/work; }
โปรแกรมคำนวณค่าแรงรวม Overload Constructor class daily_emp extends employee { public daily_emp (int h,float r) { super(h,r); } } class monthly_emp extends employee { public monthly_emp (int h, float r, float b) { super(h,r,b);
โปรแกรมคำนวณค่าแรงรวม Overload Constructor public class InheritOverLoadTest { public static void main(String[] args) { float rate; Scanner scan = new Scanner(System.in); System.out.print("Enter total OT hour : "); int hour = scan.nextInt(); employee emp1 = new employee(hour); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp1.rate + " * " + hour + ") = " + emp1.pay + " BAHT");
โปรแกรมคำนวณค่าแรงรวม Overload Constructor System.out.print("\"Daily Employee\"\nRate per Day = "); rate = scan.nextFloat(); daily_emp emp2 = new daily_emp(hour,rate); System.out.println("Total OT Pay = (" + emp2.rate + " * " + hour + ") = " + emp2.pay + " BAHT"); System.out.print("\"Monthly Employee\"\nEnter Salary = "); System.out.print("Enter Bonus = "); float bonus = scan.nextFloat(); monthly_emp emp3 = new monthly_emp(hour,rate/30,bonus); System.out.println("Total OT Pay = (" + emp3.rate + " * " + hour + ") + " + bonus + " = " + emp3.pay + " BAHT"); }
รู้จักกับ FinalClass และ FinalMethod ทำให้มีคุณสมบัติดังนี้ ตัวแปรเป็นค่าคงที่ ไม่สามารถเปลี่ยนแปลงค่าได้ เมธอดไม่สามารถถูก override ได้ คลาสไม่สามารถถ่ายทอดคุณสมบัติได้ คือไม่สามารถเป็นคลาสแม่ได้
โปรแกรมการคำนวณค่าแรงรวม โดยใช้ FinalClass import java.util.Scanner; final class employee { float rate = 300.0f, work=10.0f; int hour; float calOT() { return hour * rate / work; } float calOT(float bonus) { float pay = hour*rate/work; if (hour>100) pay += bonus; return pay; }
โปรแกรมการคำนวณค่าแรงรวม โดยใช้ FinalClass public class FinalTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); employee emp = new employee(); System.out.print("Enter total OT hour : "); emp.hour = scan.nextInt(); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp.rate + " * " + emp.hour + ") = " + emp.calOT() + " BAHT"); employee daily_emp = new employee(); daily_emp.hour = emp.hour; System.out.print("\"Daily Employee\"\nRate per Day = "); daily_emp.rate = scan.nextFloat(); System.out.println("Total OT Pay = (" + daily_emp.rate + " * " + daily_emp.hour + ") = " + daily_emp.calOT()+ " BAHT");
โปรแกรมการคำนวณค่าแรงรวม โดยใช้ FinalClass employee monthly_emp = new employee(); monthly_emp.hour = emp.hour; System.out.print("\"Monthly Employee\"\nEnter Salary = "); monthly_emp.rate = scan.nextFloat(); monthly_emp.rate = monthly_emp.rate/30; System.out.print("Enter Bonus = "); int b = scan.nextInt(); System.out.println("Total OT Pay = (" + monthly_emp.rate + " * " + monthly_emp.hour + ") + " + b + " = " + monthly_emp.calOT(b) + " BAHT"); }
โปรแกรมการคำนวณค่าแรงรวม โดยใช้ FinalMethod class daily_emp extends employee { } class monthly_emp extends employee { float calmOT(float bonus) { float pay = hour*rate/work; if (hour>100) pay += bonus; return pay; } import java.util.Scanner; class employee { float rate = 300.0f, work=10.0f; int hour; final float calOT() { return hour*rate/work; } }
โปรแกรมการคำนวณค่าแรงรวม โดยใช้ FinalMethod public class FinalMethod { public static void main(String[] args) { Scanner scan = new Scanner(System.in); employee emp1 = new employee(); System.out.print("Enter total OT hour : "); emp1.hour = scan.nextInt(); System.out.println("\"Employee\"\nTotal OT Pay = (" + emp1.rate + " * " + emp1.hour + ") = " + emp1.calOT() + " BAHT"); daily_emp emp2 = new daily_emp(); emp2.hour = emp1.hour; System.out.print("\"Daily Employee\"\nRate per Day = "); emp2.rate = scan.nextFloat(); System.out.println("Total OT Pay = (" + emp2.rate + " * " + emp2.hour + ") = " + emp2.calOT()+ " BAHT");
โปรแกรมการคำนวณค่าแรงรวม โดยใช้ FinalMethod monthly_emp emp3 = new monthly_emp(); emp3.hour = emp1.hour; System.out.print("\"Monthly Employee\"\nEnter Salary = "); emp3.rate = scan.nextFloat(); emp3.rate = emp3.rate/30; System.out.print("Enter Bonus = "); int b = scan.nextInt(); System.out.println("Total OT Pay = (" + emp3.rate + " * " + emp3.hour + ") + " + b + " = " + emp3.calmOT(b) + " BAHT"); }
Encapsulation เป็นการซ่อนรายละเอียดเพื่อป้องกันไม่ให้ ออบเจ็กต์ภายนอกเข้าถึงข้อมูล ได้อย่างอิสระ ออบเจ็กต์ไม่สามารถเรียกใช้หรือเปลี่ยนแปลงค่า ข้อมูลได้ สามารถจำกัดสิทธิการใช้งานแอตทริบิวต์และเมธ อดได้ด้วย ระดับการเข้าใช้งานของ access modifier หากต้องการซ่อนรายละเอียด ให้กำหนดเป็นแบบ private หากต้องการใช้งานแอตทริบิวต์หรือเมธอดใดๆ ให้กำหนดเป็นแบบ public
โปรแกรมคำนวณค่าแรงรวม ใช้ Encapsulation
Reference ผศ.สุดา เธียรมนตรี, คู่มือเรียนเขียน โปรแกรมภาษา Java .บริษัท ไอดีซี พรีเมียร์ จำกัด .กรุงเทพฯ: 2555.