150 likes | 231 Views
บทที่ 11. Inheritance และ Encapsulation. ความหมายของ Inheritance. การสร้างหรือพัฒนาคลาสใหม่จากคลาสเดิมที่มีอยู่แล้ว คลาสใหม่จะนำแอ ตทริบิวต์ และเมธอดของคลาสเดิมมาใช้ เป็นการถ่ายทอดคุณสมบัติจากคลาสหนึ่งสู่อีกคลาสหนึ่งนั่นเอง เรียกคลาสที่ถ่ายทอดคุณสมบัติของคลาสว่า คลาสแม่ ( SuperClass )
E N D
บทที่ 11 Inheritance และ Encapsulation
ความหมายของ Inheritance • การสร้างหรือพัฒนาคลาสใหม่จากคลาสเดิมที่มีอยู่แล้ว • คลาสใหม่จะนำแอตทริบิวต์และเมธอดของคลาสเดิมมาใช้ • เป็นการถ่ายทอดคุณสมบัติจากคลาสหนึ่งสู่อีกคลาสหนึ่งนั่นเอง เรียกคลาสที่ถ่ายทอดคุณสมบัติของคลาสว่า คลาสแม่ (SuperClass) เรียกคลาสที่ได้รับการถ่ายทอดว่า คลาสลูก (Subclass) • คลาสลูกสามารถพัฒนาต่อเติมแอตทริบิวต์และเมธอดของตัวเองได้ • คลาสลูกสามารถปรับปรุงแก้ไขแอตทริบิวต์และเมธอดเดิมที่ได้รับ มาจากคลาสแม่ได้
ตัวอย่างการสร้างคลาสแม่ - คลาสลูก • คลาส Car เป็นคลาสรถทั่วไปที่มีสามารถ • สตาร์ทเครื่องได้ – start() • เปลี่ยนเกียร์ได้ – ChangeGear() • ดับเครื่องได้ – stop() • คลาส Bus เป็นคลาสรถบัสที่มีสามารถ • สตาร์ทเครื่องได้ เปลี่ยนเกียร์ได้ ดับเครื่องได้ • มีผู้โดยสาร - Seat • ดังนั้น คลาส Car เป็นคลาสแม่ และ คลาส Bus เป็นคลาสลูกที่สืบทอดคุณสมบัติจากคลาส Car
รู้จักกับคลาสแม่ (SuperClass) • เป็นคลาสที่เป็นต้นแบบของแอตทริบิวต์และเมธอด • อนุญาตให้คลาสอื่นสืบทอดแอตทริบิวต์และเมธอดไปได้ทั้งหมด ยกเว้นแอตทริบิวต์ที่มีระดับการเข้าถึงเป็น private และ เมธอดที่เป็น constructor • ระดับการเข้าถึงแอตทริบิวต์และเมธอดของคลาสแม่เป็น protected มีรูปแบบการใช้งาน ดังนี้ [modifier] class SuperClassName { [AttributeName] [MethodName] } โดยที่ modifier เป็นคีย์เวิร์ดที่กำหนดคุณสมบัติการเข้าถึงคลาส SuperClassName เป็นชื่อคลาสแม่ AttributeName เป็นส่วนของการประกาศแอตทริบิวต์ MethodName เป็นส่วนของการประกาศเมธอด
รู้จักกับคลาสลูก (SubClass) โดยที่ modifier เป็นคีย์เวิร์ดที่กำหนดคุณสมบัติการเข้าถึงคลาส SubClassNameเป็นชื่อคลาสลูก SuperClassNameเป็นชื่อคลาสแม่ AttributeName เป็นส่วนของการประกาศแอตทริบิวต์ MethodName เป็นส่วนของการประกาศเมธอด • เป็นคลาสที่สืบทอดแอตทริบิวต์และเมธอดจากคลาสแม่ • คลาสลูกสามารถเรียกใช้แอตทริบิวต์และเมธอดจากคลาสแม่ได้ • และคลาสลูกมีแอตทริบิวต์และเมธอดเพิ่มเติมเป็นของตัวเองได้ • การระบุความสัมพันธ์ให้คลาสเป็นคลาสลูกต้องใช้คีย์เวิร์ดextends มีรูปแบบการใช้งาน ดังนี้ [modifier] class SubClassName extends SuperClassName { [AttributeName] [MethodName] }
โปรแกรมกำหนดค่าแรงรายวันให้กับคลาสแม่-คลาสลูกโปรแกรมกำหนดค่าแรงรายวันให้กับคลาสแม่-คลาสลูก 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 : "); r = scan.nextFloat(); monthly_emp emp3 = new monthly_emp(); emp3.rate = r; System.out.println("Rate per Day = " + emp3.rate/30 +" BAHT"); } } import java.util.Scanner; class employee { protected float rate=300.0f; } class daily_emp extends employee { } class monthly_emp extends employee { }
รู้จักกับ Overriding method • Overriding เป็นการเปลี่ยนแปลงการทำงานของเมธอดในคลาสลูก ที่สืบทอดมาจากคลาสแม่ • เมธอดในคลาสลูกจะมีชื่อเมธอด, ชนิดข้อมูลที่คืนค่า, จำนวนและชนิดข้อมูลของอาร์กิวเมนต์ที่เหมือนกับคลาสแม่ • สามารถพัฒนาเมธอดให้มีการทำงานในเรื่องเดียวกัน แต่แตกต่างกัน ในรายละเอียดของการทำงาน เช่น • การคำนวณหาพื้นที่ของรูปทรงเรขาคณิตต่าง ๆ ที่มีสูตรคำนวณที่แตกต่างกัน • การคำนวณค่าแรงของพนักงานที่มีวิธีคำนวณที่แตกต่างกันไปในแต่ละตำแหน่ง
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"); 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"); } } โปรแกรมคำนวณค่าแรงรวม Override เมธอด calOT() import java.util.Scanner; class employee { protected float rate = 300.0f, work=10.0f; int hour; float calOT() { return hour*rate/work; } } 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; } }
รู้จักกับ Overload Constructor • constructor เป็นสิ่งที่คลาสลูกไม่สามารถสืบทอดจากคลาสแม่ได้ • แต่คลาสลูกสามารถใช้งาน constructor ของคลาสแม่ได้ โดยใช้คีย์เวิร์ด super • จึงสามารถทำ overload constructor ในคลาสแม่ได้ตามปกติ
class daily_emp extends employee { public daily_emp (inth,float r) { super(h,r); } } class monthly_emp extends employee { public monthly_emp (int h, float r, float b) { super(h,r,b); } } 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 import java.util.Scanner; class employee { protected float rate = 300.0f, work=10.0f, pay; public employee(int h) { pay = h*rate/work; } 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; } } 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 = "); rate = scan.nextFloat(); 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 • Final เป็นคีย์เวิร์ดที่ใช้นำหน้าตัวแปร, เมธอด และคลาส ทำให้มีคุณสมบัติดังนี้ • ตัวแปรเป็นค่าคงที่ ไม่สามารถเปลี่ยนแปลงค่าได้ • เมธอดไม่สามารถถูก 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; } } 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"); • 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 import java.util.Scanner; class employee { float rate = 300.0f, work=10.0f; int hour; final float calOT() { return hour*rate/work; } } 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; } } 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"); 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