30
Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ _การรับทอดมรดก วิชา การเขียนโปรแกรมเชิงวัตถุ (4122309) สป. ที9 วันที23 ม.ค. 2563 โดย อ.ดร.นัฐพงศ์ ส่งเนียม http://www.siam2dev.net เนื้อหา 1. การรับทอดมรดก (Inheritance) 2. Polymorphism a. Overloading b. Overriding c. Super class d. Sub class ทบทวน สรุปคำศัพท์ ในบทนี1. การรับทอดมรกด (Inheritance)

Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

Workshop08: หลกการเขยนโปรแกรมเชงวตถ_การรบทอดมรดก วชา การเขยนโปรแกรมเชงวตถ(4122309) สป. ท 9 วนท 23 ม.ค. 2563 โดย อ.ดร.นฐพงศ สงเนยม http://www.siam2dev.net

เนอหา

1. การรบทอดมรดก (Inheritance) 2. Polymorphism

a. Overloading b. Overriding c. Super class d. Sub class

ทบทวน

สรปคำศพท ในบทน

1. การรบทอดมรกด (Inheritance)

Page 2: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

Inheritance

Inheritance เปนรปแบบของการนำกลบมาใชใหม (Reusable) ของซอฟตแวร ซงคลาสใหม

จะถกสรางจากการรบส งตาง ๆ จากคลาสท มอยแลวท งสวน Attribute และสวนของ Function หรอ

Method นอกจากนคลาสใหมยงสามารถเพมเตมความสามารถบางประการตามตองการ

ดงนนคลาสทถกสรางใหมจะไดรบคณสมบตของคลาสเดมและเพมคณสมบตบางประการ

• เพอแกปญหาการเขยนโปรแกรมซำซอนกนได อะไรทซำ ๆ กนกไมตองสรางใหม นำสงทมอยแลว

กลบมาใชใหม (Reusable)

• เมธอดหรอแอตทรบวตทคลาสตาง ๆ มรวมกนจะถกนำไปใสในคลาสแม (Parent class , Based

class , Super class)

• คลาสลก (child class , sub class, derive class ) จะสบทอดเมธอดและแอตทรบวตคลาสแมโดย

อตโนมต

Page 3: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

จากรป ม 3 คลาส คอ คลาส แมว คลาสปลา คลาส ลง จะเหนวาสงทคลายกน คอ อาย ความหว กน นอน

จดสงทเหมอนกน ไปไวอกคลาสหนง (Generalization) ใหเปนคลาสพอแม (Parent) คลาสลกกจะสบทอด

มา กจะไดรบทอดมรดกมา (Inheritance)

Supper Class

Sub Class

Inherit

สตว

- อาย - ความหว

+ กน() + นอน()

แมว ลง ปลา

+ เกบลกปลา + จบหน + วายนำ

Page 4: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

แมว ปลา ลง เปน สตว เหมอนกน กจะไดรบทอดมรดก แบบเดยวกน ดงนน แมว ปลา ลง กไม

จำเปนตองสรางสงทเคยสรางไวแลว

แต แมว ปลา ลง อาจจะมสงทเปนเอกลกษณของตวเองได เชน ลงเกบลกมะพราว ปลาวายนำ แมว

จบหน ซงไมเหมอนกนได ไมจำเปนจะตองเหมอนกนกบคลาสพอแม หมายถงจะรบ หรอไมรบคณสมบต

บางอยางได และ ทรบมาอาจมการดดแปลง หรอเปลยนแปลงบางอยางใหเหมาะกบคลาสตวเองได เรยกวา

การทำ Overriding Method

ในภาษาจาวา เราจะสรางคลาสใหมการสบทอดโดยใช Keyword extends ตอทายคลาสลกดงน

// parent class / super class class Animal { } //---- sub class class cat extends Animal { } class fish extends Animal { } class Monkey extends Animal{ }

เปดโปรแกรม NetBeanIDE ขนมา

1. สราง Project ใหม

2. ตงชอ Test_Inheritance เกบไวท D:\OOP

Page 5: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

3. สรางจาวาคลาส ขน

4. ตงชอ Animal

พมพคำสงในคลาส Animal

Page 6: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

SOURCE CODE:

package test_inheritace; public class Animal { // Data Member private short Age; private String hangry; // Constructor Method public Animal() {} // empty constructor method public Animal(short a) {Age = a; } // Method Member public void eat(){ System.out.println("Eating..."); } public void sleep(){ System.out.println("Sleeping..."); } }

Page 7: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

6. สรางจาวา คลาส ชอ Cat

คำสงในคลาส Cat

SOURCE CODE:

package test_inheritace; public class Cat extends Animal {

Page 8: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

}

7. สรางคลาส Fish และพมพคำสงดงน

SOURCE CODE:

package test_inheritace; public class Fish extends Animal { }

Page 9: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

8. สรางคลาส Monkey และพมพคำสงดงน

SOURCE CODE:

package test_inheritace; public class Monkey extends Animal { }

9. สรางและทดสอบ การทำงาน Scenario น

9.1 สราง A เปน Animal 9.2 สราง C เปน Cat 9.3 สราง F เปน Fish

Page 10: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

9.4 สราง M เปน Monkey 9.5 สงให กน และ นอน ทงสามตว

SOURCE CODE:

package test_inheritace; public class Test_Inheritace { public static void main(String[] args) { Animal A = new Animal(); Cat C = new Cat(); Fish F = new Fish(); Monkey M = new Monkey(); C.eat(); C.sleep(); F.eat(); F.sleep(); M.eat(); M.sleep(); } }

Page 11: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

ผลลพธ การทำงาน

คลาสลก ทงสามคลาสไดแก Cat Fish , Monkey ไมม Attribute หรอ Method แตสามารถทำงาน

หรอเรยกใชงานทง Attribute และ Method ทพอแม มใหได

Page 12: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

ตวอยางท 1. บรษทแหงหนง พนกงานมชอ รหส ตำแหนง เงนเดอน ผจดการกจดวาเปนพนกงานคนหนงซง

กมคณสมบตเหมอนพนกงาน แต ผจดการสามารถมเงนประจำตำแหนง และ มแผนกทตองดแล จงเขยน

โปรแกรมเพอแสดงการรบทอดมรดกของผจดการจากคลาสพนงงาน

พนกงาน

- รหสพนกงาน : String - ชอ : String - เงนเดอน : double - ตำแหนง : String

+ พนกงาน ( ) + พนกงาน (ตำแหนง : String) + กำหนดชอ ( ) + กำหนดรหสพนกงาน () + กำหนดเงนเดอน () + กำหนดตำแหนง () + บอกชอ () + บอกเงนเดอน () + บอกตำแหนง () + toString( )

ผจดการ

- เงนประจำตำแหนง : Double

- แผนก : String

+ ผจดการ()

+ ผจดการ(แผนก:String)

+ กำหนดเงนประจำตำแหนง()

+ กำหนดตำแหนง()

+ toString()

Page 13: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

• ใหสราง Project ใหม ตงชอ Test_Company

สราง Java Class

- Employee

- Manager

Page 14: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

SOURCE CODE: Employee

package test_company; public class Employee { private String empID; private String empName; private double empSalary; private String empPosition; //---constructor public Employee(){} public Employee(String pos) { empPosition= pos;} //--- setter method public void setEmpID(String id){ empID = id;} public void setEmpName(String n) {empName = n;} public void setEmpSalary(double sal) {empSalary =sal;} public void setEmpPosition(String pos) {empPosition = pos;} //--- getter method public String getEmpID() {return empID;} public String getEmpName() {return empName;} public double getEmpSalary(){return empSalary;} public String getEmpPosition() {return empPosition;} //--- toString method public String toString(){ return "Employee ID : " + empID + ", Employee Name : " + empName + ", Employee Salary : " + empSalary + ", Employee Position : " + empPosition; } }

Page 15: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

*** Method toString() เปนเมธอดทมไวสำหรบบอกรายละเอยดของวตถนนๆ ออกมาเปนขอความ

คลาส Manager

SOURCE CODE:

package test_company; public class Manager extends Employee { private double posFee; private String department; //--- constructor

Page 16: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

public Manager() {} // empty constructor method public Manager(String dept) {department = dept; } //--- setter method public void setPosFee(double fee) {posFee = fee;} public void setDepartment(String dept) {department = dept;} //--- getter method public double getPosFee() {return posFee;} public String getDepartment() {return department;} //--- toString method public String toString() { return "Employee ID : " + super.getEmpID() + "Employee Name : " + super.getEmpName() + "Department : " + this.getDepartment() + "Position Fee :" + this.getPosFee(); } }

Page 17: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

ทดสอบการทำงาน Scenario

1. สราง พนกงาน emp1 emp2 emp3

2. สราง ผจดการ m1 m2

3. กำหนด รหส ชอ ตำแหนง ใหพนกงานทงสามคน

4. กำหนด ชอ ตำแหนง เงนประจำตำแหนง และแผนกใหผจดการ

5. เรยกใช toString ของทกออบเจกต

SOURCE CODE:

package test_company; public class Test_Company { public static void main(String[] args) { //--- สรางพนกงาน emp1 emp2 emp3 Employee emp1 = new Employee(); Employee emp2 = new Employee("นกบญช"); Employee emp3 = new Employee("โปรแกรมเมอร"); emp1.setEmpID("emp001"); emp2.setEmpID("emp002"); emp3.setEmpID("emp003");

Page 18: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

emp1.setEmpName("นฐพงศ สงเนยม"); emp2.setEmpName("สมชาย มสข"); emp3.setEmpName("ญาญา จรงใจ"); emp1.setEmpSalary(180000.0d); emp2.setEmpSalary(80000.0d); emp3.setEmpSalary(50000.0d); System.out.println( emp1.toString()); System.out.println( emp2.toString()); System.out.println( emp3.toString()); //--- ผจดการ Manager m1 = new Manager("ฝายไอท"); Manager m2 = new Manager("ฝายบคคล"); m1.setEmpID("Manager001"); m2.setEmpID("Manager002"); m1.setPosFee(5000.0d); m2.setPosFee(10000.0d); m1.setEmpName("สมควร มากม"); m2.setEmpName("นฐพงศ สงเนยม"); m1.setEmpSalary(200000.0d); m2.setEmpSalary(500000.0d); System.out.println( m1.toString()); System.out.println(m2.toString()); } }

Page 19: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

ผลลพธ

Polymorphism

- Overloading Method

- Overriding Method

การตงชอเมธอดของคลาสลกซำกบคลาส แตมการเปลยนแปลงหรอดดแปลงพฤตกรรม ให

เหมาะกบคลาส จาก ตวอยางจะเหนคลาส Manager กบ Employee ตวเดยวกน คอ toString แต

วา ตอนทรนผลลพธ คลาส Manager มการเรยกใชงาน toString ของตวเอง ไมใช toString ของ

Employee เรยกวาเปนการทำ Overriding Method

นำ toString ของ Employee มาใชใหม

Page 20: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

//--- toString method public String toString() { return super.toString() + ", Department : " + this.getDepartment() + ", Position Fee :" + this.getPosFee(); }

*** overriding method

Page 21: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

แบบฝกหด 8.1

ในงานระบบธนาคารทวไป บญชธนาคาร แบงเปน บญชเงนฝากกระแสรายวน บญชเงนฝากออม

ทรพย (Saving Account) บญชเงนฝากประจำ จงเขยนโปรแกรมตามแผนภาพน และทดสอบการทำงาน ตาม

Scenario น

1. สรางสมดบญช B1 B2 B3 เปน BankAccount

2. สรางสมดบญช B4 , B5 เปน SavingsAccount

3. ทำการฝากเงน 10000 20000 30000 สำหรบ B1 , B2 , B3

4. ทำการฝากเงน 50000 100000 สำหรบ B4 และ B5

5. ทำการถอน เงน 3000 ออกจากทกบญช

6. สรางเมธอด toString ของทงสองคลาส และแสดงผลลพธ

***accrue Interest ดอกเบยทเพมขน / ปรบดอกเบย

*** interest Earned ดอกเบยทไดรบ

Page 22: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

สราง Project ชอ Test_BankAccount

• สรางจาวาคลาส 2 ไฟล ดงรป

Page 23: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·
Page 24: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

SOURCE CODE:

package test_bankaccount_2020; public class BankAccount { private String Owner; private String accID; private double balance; //--- Overloading Constructor Method public BankAccount(){} public BankAccount(double bal) {balance = bal; } //--- Setter Method public void setOwner(String o) {Owner = o; } public void setAccID(String id){accID=id; } public void setBalance(double bal) {balance=bal;} //--- Overloading Method public void deposit(double amt){ balance +=amt;} public void deposit(int amt){ balance +=amt;} public void withdraw(double amt){ balance -=amt;}

Page 25: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

public void withdraw(int amt){ balance -=amt;} //--- Gettter Method public String getOwner() {return Owner;} public String getID() {return accID;} public double getBalance() {return balance; } }

คลาส SavingsAccount

***Balance นนเปน attribute ของคลาส BankAccount แบบ private ดงนน หากตองการให

คลาสลกเขาถง หรอมองเหน จะตองกำหนดเปน protected (#)

Page 26: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

SOURCE CODE: SavingsAccount

package test_bankaccount_2020; public class SavingsAccount extends BankAccount { private double rate; private double InterestAccumulated; //--- Overloading Constructor Method public SavingsAccount(){} // empty constructor public SavingsAccount(double r) {rate = r;} //--- setter method public void setRate(double r){rate = r;} // ปรบเพมดอกเบย public void setAccrueInterest(double rate_amt) {rate +=rate_amt;} //--- getter method public double getRate( ){return rate;} public double interestEarned() {return super.balance*rate;} //--- toString public String toString(){ return "Owner : " + super.getOwner() + ", account ID : " + super.getID() + ", Balance : " + super.getBalance() + ", Interest Earned : " + this.interestEarned();

Page 27: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

} }

@Over

Page 28: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

*** B1-B3 ไมใช SavingAccount ไมมดอกเบย

Page 29: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·

ผลลพธ

Page 30: Workshop08: หลักการเขียนโปรแกรมเชิงวัตถุ การรับทอดมรดกsiam2dev.net/E_Learning/OOP/Workshop08_OOP_PART... ·