Chapter 9 Inheritance Encapsulation Polymorphism L. Ngamprasit 2 การสืบทอด (Inheritance)  การสืบทอด--เป็ นการนาโค้ดกลับมาใช้ใหม่  สามารถนาคลาสที่ถูกประกาศไว้แล้วมาปรับปรุงแก้ไขให้เกิดเป็ นคลาส ใหม่ได้ โดยที่ไม่ตอ้ งเริ่มต้นเขียนใหม่ทง้ั หมด คลาสแม่ (Superclass) คลาสลูก (Subclass) L.

Download Report

Transcript Chapter 9 Inheritance Encapsulation Polymorphism L. Ngamprasit 2 การสืบทอด (Inheritance)  การสืบทอด--เป็ นการนาโค้ดกลับมาใช้ใหม่  สามารถนาคลาสที่ถูกประกาศไว้แล้วมาปรับปรุงแก้ไขให้เกิดเป็ นคลาส ใหม่ได้ โดยที่ไม่ตอ้ งเริ่มต้นเขียนใหม่ทง้ั หมด คลาสแม่ (Superclass) คลาสลูก (Subclass) L.

Chapter 9
Inheritance
Encapsulation
Polymorphism
1
L. Ngamprasit
2
การสืบทอด (Inheritance)
 การสืบทอด--เป็ นการนาโค้ดกลับมาใช้ใหม่
 สามารถนาคลาสที่ถูกประกาศไว้แล้วมาปรับปรุงแก้ไขให้เกิดเป็ นคลาส
ใหม่ได้ โดยที่ไม่ตอ้ งเริ่มต้นเขียนใหม่ทง้ั หมด
คลาสแม่ (Superclass)
คลาสลูก (Subclass)
L. Ngamprasit
3
การสืบทอด (Inheritance)
L. Ngamprasit
4
การสืบทอด (Inheritance)
 ทาได้โดยใช้คียเ์ วิรด์
extends ตามด้วยชื่อคลาสที่เราต้องการสืบ
ทอด
 คลาสลูกจะได้รบั attribute และ method มาจากคลาส
แม่โดยที่ไม่ตอ้ งเขียนซ้า
ข้อยกเว้น
ถ้าหาก attribute และเมธอดที่สืบทอดมานัน้ มี
access modifier ที่ คลาสแม่เป็ น private เราจะไม่
สามารถอ้างถึง attribute โดยตรงที่คลาสลูกได้ แต่
L. Ngamprasit
5
constructor จะไม่ได้รบั การสืบทอด
 constructor
 คลาสลูกจะต้องสร้าง
ของคลาสแม่จะไม่ถ่ายทอดให้กบั คลาสลูก
constructor ของตัวเองขึ้นมาเอง
 constructor
ของคลาสลูกจะต้องเรียก constructor
ของคลาสแม่เป็ นอันดับแรกเสมอ เพื่อกาหนดค่าเริ่มต้นให้กบั
attribute ที่สบื ทอดมา ซึ่งทาได้โดยใช้คยี เ์ วิรด์ super(…)
L. Ngamprasit
6
ตัวอย่างคลาส BankAccount
 มีก่ี attribute
อะไรบ้าง
 มีก่เี มธอด
อะไรบ้าง
 accessor และ mutator method คือเมธอดใดบ้าง
 จงยกตัวอย่างการสร้าง object ชื่อ one จากคลาสนี้
 เมธอด withdraw มีเงือ่ นไขการถอนเงินอย่างไร
 เมธอด deposit มีเงือ่ นไขการฝากเงินอย่างไร
L. Ngamprasit
7
ตัวอย่างคลาส CheckingAccount
extends คืออะไร
 ในที่น้ ี คลาสแม่ได้แก่ ..................... และคลาสลูกได้แก่ ...................
 คลาสนี้ ได้รบั การสืบทอดอะไรมาจากคลาสแม่บา้ ง
 คลาสนี้ มีความพิเศษกว่าคลาสแม่อย่างไร
 attribute ที่คลาสนี้ สามารถเข้าถึงหรือเรียกใช้งานได้โดยตรงคืออะไร
 คียเ์ วิรด์ super() คืออะไร
 เมธอดใหม่ท่เี พิ่มเข้ามามีอะไรบ้าง
L. Ngamprasit
 มีการ override เมธอดหรือไม่ อย่างไร
 คียเ์ วิรด์
8
ตัวอย่างคลาส AccountTest
 ออบเจ็กต์ b
ถูกสร้างขึ้นมาจากคลาสอะไร
 ออบเจ็กต์ c ถูกสร้างขึ้นมาจากคลาสอะไร
 เมื่อ b และ c เรียกใช้เมธอด withdraw แล้ว เพราะเหตุใด
จึงได้ผลลัพธ์ต่างกัน
L. Ngamprasit
9
ทดสอบความเข้าใจ
ที่คลาส CheckingAccount
จง override เมธอด deposit ให้สามารถฝากเงินได้เฉพาะจานวน
เงินที่มากกว่า 0 เท่านั้น
 ที่คลาส AccountTest (main class) จงเขียนโค้ดใหม่ตามลาดับ

1) จงสร้าง object ชื่อ c ของคลาส CheckingAccount โดยมี
รายละเอียดดังนี้
Nanny หมายเลขบัญชีคือ 0012 มีเงินในบัญชี 10000 บาท และ
ต้องเสียค่าธรรมเนี ยมกรณี ถอนเกินวงเงิน 10 บาท
 ชื่อบัญชีคอื
2) เรียกเมธอดเพือ่ ฝากเงินเข้าบัญชี Nanny จานวน 0 บาท
3) เรียกเมธอดเพือ่ ฝากเงินเข้าบัญชี Nanny จานวน 30,000 บาท
4) เรียกเมธอดเพือ่ ถอนเงินออกจากบัญชี Nanny เป็ นเงิน 45,000 บาท
L. Ngamprasit
5) แสดงผลจานวนเงินในบัญชี Nanny ออกทางจอภาพ
10
หลักการห่อหุม้ (Encapsulation)
ศึกษาหัวข้อที่ 2 เรื่อง หลักการห่อหุม้
แล้วตอบคาถามใน slide ถัดไป
L. Ngamprasit
11
หลักการห่อหุม้ (Encapsulation)
ตัวอย่างที่ 1 – 3 มีการใช้หลักการห่อหุม้ อย่างไร
 ข้อดีของการใช้หลักการห่อหุม้ คืออะไรบ้าง
 จะเกิดอะไรขึ้นกับคลาสลูก ถ้าในคลาสแม่มีการกาหนดค่าแอตทริบวิ ต์ต่างๆ เป็ น
protected
 เพราะเหตุใดการตัง้ ค่า access modifier เป็ น protected จึง
อาจทาให้เกิดปัญหาได้

ถ้าในคลาสแม่มีการตัง้ ค่า protected ให้กบั แอตทริบวิ ต์ แล้วหลังจากนั้นมีการ
แก้ไขหรือเปลี่ยนชื่อแอตทริบวิ ต์น้นั ใหม่ คลาสลูกอาจจะต้องแก้ไขโค้ดด้วย
L. Ngamprasit
12
การพ้องรูป (Polymorphism)
ถ้าคลาส CheckingAccount เป็ นคลาสลูกของ
BankAccount แล้ว …

เราสามารถสร้าง object ใหม่ (ในที่น้ ี คอื d) ด้วยคาสัง่ ด้านล่างนี้ ได้หรือไม่?
BankAccount d = new CheckingAccount(“Sue”, “008”, 50, 2);

L. Ngamprasit
13
การพ้องรูป (Polymorphism)
เมื่อสร้างออบเจ็กต์ d ด้วยคาสัง่
BankAccount d = new CheckingAccount(“Sue”, “008”, 50, 2);
ได้แล้ว …

ถ้าเรียกใช้เมธอด withdraw ด้วยคาสัง่ ด้านล่างนี้ จะได้ผลลัพธ์อย่างไร?
d.withdraw(100);
Balance จะมีค่าเป็ น -52
เพราะเหตุใด???
L. Ngamprasit
14
การพ้องรูป (Polymorphism)
Polymorphism
ทาให้เราเขียนโปรแกรมที่สามารถประมวลผลออบเจ็กต์ต่างๆ
ที่สบื ทอดมาจากคลาสแม่เดียวกันได้
L. Ngamprasit
15
พิจารณาโค้ดในตัวอย่างที่ 4 หน้าที่ 7
สังเกตผลลัพธ์ท่ไี ด้
ศึกษาหัวข้อที่ 3 เรื่อง การพ้องรูป
L. Ngamprasit
16
การพ้องรูป (Polymorphism)
จากตัวอย่างที่ 4
 คลาสแม่คอื SuperClass
 คลาสลูกคือ SubClasss
 ออบเจ็กต์ a เป็ นออบเจ็กต์ของคลาสแม่ -> ใช้เมธอดของคลาสแม่
 ออบเจ็กต์ c เป็ นออบเจ็กต์ของคลาสลูก -> ใช้เมธอดที่สบื ทอดมาจากคลาส
แม่และเมธอดของคลาสลูก
 ออบเจ็กต์ b ???
L. Ngamprasit
17
การพ้องรูป (Polymorphism)
SuperClass a = new SuperClass();
a
SuperClass
SuperClass object
a.print();

L. Ngamprasit
18
การพ้องรูป (Polymorphism)
SubClass c = new SubClass();
c
SuperClass
c.print();
c.print2();


SubClass
SubClass object
L. Ngamprasit
19
การพ้องรูป (Polymorphism)
SuperClass b = new SubClass();
b
SuperClass

SubClass
b.print();
SubClass object
b.print2();
((SubClass)b).print2();


L. Ngamprasit
20
การพ้องรูป (Polymorphism)
จากตัวอย่างที่ 4
ออบเจ็กต์ b ???
เนื่ องจากใช้คาสัง่ SuperClass b = new
SubClass();
สังเกตว่า b จะสามารถเรียกใช้เมธอดที่สืบทอด
มาจากแม่ หรือ override ของแม่ได้เท่านัน้
เพราะประกาศให้ b เป็ นตัวแปรของ
SuperClass
L. Ngamprasit
21
การพ้องรูป (Polymorphism)
จากตัวอย่างที่ 4
 downcasting คืออะไร และใช้เมื่อใด
 เราสามารถเรียกใช้เมธอด ด้วยคาสัง่ ด้านล่างนี้ ได้หรือไม่?
 a.print2();
 ((SubClass)a).print2();
 c.print2();
L. Ngamprasit
22
การพ้องรูป (Polymorphism)
กลับไปพิจารณาคลาส BankAcccount และ
CheckingAccount
BankAccount d = new CheckingAccount(“Sue”, “008”, 50, 2);
100 d.withdraw(100);
ถ้าต้องการถอนเงิน
บาท
d.deposit(50);
ถ้าต้องการฝากเงิน 50 บาท
((CheckingAccount)d).setOverdraftFee(10);
ถ้าต้องการกาหนด
ค่าธรรมเนี ยม
(fee)ใหม่ เป็ น 10 บาท
L. Ngamprasit
23
การพ้องรูป (Polymorphism)
สมมติให้
คลาส Animal เป็ นคลาส
แม่
และ
คลาส Dog เป็ นคลาสลูก
ของ Animal
ปกติ
Dog d = new
Dog();
ใช้หลัก polymorphism
Animal d = new
Dog();
L. Ngamprasit
ชนิดของตัวแปรอ้างอิง
24
การพ้องรูป (Polymorphism): การนาไปใช้
สมมติให้ Animal เป็ นคลาสแม่ (superclass) และ Dog, Cat,
Wolf, Hippo, Lion เป็ นคลาสลูก
array ถูกประกาศเป็ นชนิด Animal ทาให้มน
ั สามารถ
เก็บข้อมูลออบเจ็กต์ของคลาส Animal และออบเจ็กต์
ของคลาสลูกๆได้
เราสามารถใส่ขอมู
้ ลเป็ นออบเจ็กตของ
์
คลาสลูก ให้กับ array ได้
Animal[] a = new Animal[5];
a[0] = new Dog();
a[1] = new Cat();
a[2] = new Wolf();
เมื่อ i เป็ น 0 เมธอด makeNoise() ของ
a[3] = new Hippo();
a[4] = new Lion();
ออบเจ็กตของ
Dog จะทางาน
์
for(int i=0 ; i < a.length ; i++) {
L. Ngamprasit
เมื
อ
่
i
เป็
น
1
เมธอด
makeNoise()
ของ
a[i].makeNoise();
}
ออบเจ็กตของ
Cat จะทางาน
์
25
การพ้องรูป (Polymorphism): การนาไปใช้
สมมติให้ Animal เป็ นคลาสแม่ (superclass) และ Dog กับ Cat
เป็
น
คลาสลู
ก
จากตัวอย่าง พารามิเตอร์มีชนิดข้อมูลเป็ น Animal จะ
สามารถรับอากิวเมนต์(argument)ที่มีชนิดข้อมูลเป็ น
class Vet {
public
void Animal
giveShot(Animal
x) {
คลาสลู
ก//ของ
ได้
give x a shot, vaccination for example
x.makeNoise();
}
}
Vet v = new Vet();
Dog d = new Dog();
Cat c = new Cat();
v.giveShot(d);
v.giveShot(c);
L. Ngamprasit
26
หลักการ Abstraction
ถ้าต้องการสร้างคลาส Animal ซึ่งเป็ นคลาสของสัตว์ทวั ่ ไป ไม่เฉพาะเจาะจง
เพื่อเป็ นคลาสแม่ของคลาสลูกอืน่ ๆ ได้แก่คลาส Dog, Cat, Cow,
Rabbit, Sheep, Kangaroo, Snake, etc.
สมมติให้คลาส Animal มี 3 เมธอด คือ
eat()
makeNoise()
walk()
เราจะเขียนเมธอด eat(), makeNoise() และ
walk() ให้มีการทางานอย่างไรดี ??
L. Ngamprasit
27
หลักการ Abstraction
เราจะเขียนเมธอด eat(), makeNoise() และ
walk() ให้มีการทางานอย่างไรดี ??
ไม่ว่าจะเขียนเมธอดอย่างไร สุดท้ายที่คลาสลูก
ก็จะ override อยู่ดี เพราะสัตว์แต่ละชนิดมีการ
ต้องเขี
ยนกระบวนการท
างาน
ิ นแตกต่
กินดัส่งงนัเสีน้ ย...ง ไม่
และเด
างกัน
ให้คลาสลูกเติมเอง (override)
L. Ngamprasit
28
หลักการ Abstraction
Abstract Class
 เป็ นโครงร่างสาหรับให้คลาสลูกนาไปเติมเต็มในส่วนรายละเอียดเอง
Abstract Method
 เป็ นเมธอดที่ไม่ระบุรายละเอียดหรือส่วนของ body เพื่อให้คลาสลูกใส่รายละเอียด
ของเมธอดนั้นเอง
คลาสใดที่สบื ทอดมาจาก abstract class
L. Ngamprasit
จะต้องนิ ยาม(เขียนโค้ดรายละเอียด) abstract method
ด้วย
29
เขียนโค้ดในตัวอย่างที่ 5-7
สังเกตผลลัพธ์ท่ไี ด้
ศึกษาหัวข้อที่ 4 เรื่อง หลักการ
Abstraction
L. Ngamprasit
30
หลักการ Abstraction
Abstract class ได้อย่างไร
 เราสามารถสร้าง object จากคลาส Animal ได้หรือไม่ เพราะเหตุใด
 เมธอด makeNoise แตกต่างจากเมธอดอืน
่ ๆอย่างไร
 เพราะเหตุใดเมธอด makeNoise ของคลาส Animal จึงไม่มีสว่ นของ
body (มีเพียงเครื่องหมาย ; ปิ ดท้าย)
 คลาสลูกที่สบื ทอดมาจาก Animal ได้แก่คลาสใดบ้าง
 จากตัวอย่างที่ 5 มีการใช้หลักการห่อหุม้ (Encapsulation) อย่างไร
 มีการ override เมธอดใดบ้าง
L. Ngamprasit
 มีการพ้องรูป (Polymorphism) ที่ตวั อย่างที่เท่าใด
 เราสามารถสร้าง
31
หลักการ Abstraction
ทดสอบความเข้าใจ


สร้างคลาส Sheep ที่สืบทอดมาจากคลาส Animal
โดยกาหนดเสียงร้องของแกะตามความเหมาะสม
สร้างคลาส Beagle ที่สืบทอดมาจากคลาส Dog โดย
เพิ่มเมธอด play() ซึ่งเป็ นเมธอดที่ไม่มีพารามิเตอร์
และไม่มีการส่งค่ากลับ โดยจะแสดงข้อความออก
ทางจอภาพว่า “I am playing.”
L. Ngamprasit
32
Final Method
ที่เมธอด makeNoise ในคลาส Dog
 เพิม
่ คียเ์ วิรด์ final
public final void makeNoise()

สังเกตการเปลี่ยนแปลง
L. Ngamprasit
33
Final Class
ที่คลาส Dog
 เพิม
่ คียเ์ วิรด์ final
public final class Dog extends Animal

สังเกตการเปลี่ยนแปลง
L. Ngamprasit
34
ใบงานที่ 6
ในเว็บไซต์การเรียนการสอน
L. Ngamprasit