Chap04

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Chap04 as PDF for free.

More details

  • Words: 2,180
  • Pages: 31
Inheritance & Encapsulation

Modern Programming Languages

4

การนําคลาสมาใชงาน การสืบทอดคุณสมบัติ (Inheritancee) และการซอนรายละเอียด(Encapsulation) 4.1 การนําคลาสมาใชงาน

ลักษณะเดนของการเขียนโปรแกรมเชิงวัตถุอยางหนึ่งคือการนําคลาสกลับมาใชงานไดอีก โดยมีวิธีการนํา คลาสกลับมาใชอีกไดดังนี้ • การนําคลาสที่มีอยูมาใช (Use) • การสืบทอดคุณสมบัติ (Inheritance : “is a”) • การนําคลาสมาใชในลักษณะคอมโพสิชั่น (Composition : “has a”)  Use คือการเรียกใชงานระหวางคลาส เชน

คลาส A เรียกใชงาน คลาส B คือ เมธอดในคลาส A สรางออบเจกตของคลาส B หรือรับคา สงกลับจากคลาส B ตัวอยาง สรางคลาส Student เปนคลาสตนแบบเพื่อเอาไวเรียกใชงาน

สรางคลาส UseStudent เพื่อทําการเรียกใชงานคลาส Student

[email protected]

1/31

Inheritance & Encapsulation

Modern Programming Languages

เมื่อทําการคอมไพลและรันโปรแกรม UseStudent.java ผลลัพธที่ได

¾

จากตัวอยางขางตน มาทําความรูจักเมธอด toString() กันกอน @ เมธอด toString เปนเมธอดที่ใชในการแปลงคาในออบเจกตใหเปนขอมูลสตริง เมื่อเราทํา การแสดงผลออบเจกตนั้นดวยคําสั่ง System.out.println() หรือมีการเชื่อมตอออบเจกต นั้นกับขอมูลสตริง โดยรูปแบบของเมธอด toString() แสดงรูปแบบดังนี้

@ @ @

@

จากรูปแบบจะเห็นวาเมธอดมีการกําหนดคาคืนกลับเปนสตริงเทานั้น และคาที่สงคืนนี้เอง จะเปนคาที่ออบเจกตนั้นแปลงใหเปนขอความ พิจารณาในคลาส Student มีเมธอด toString() ที่คืนคาขอมูลสตริง โดยทําการคืนคา ขอมูลของ name และ gpa นั่นเอง พิจารณาในคลาส UseStudent ที่นําคลาส Student มาใชงาน ƒ ในบรรทัดที่ 3 มีการสรางออบเจกตพรอมกําหนดคาเริ่มตน ตามคอนสตรัค เตอรที่สรางไว (จะกลาวถึงคอนสตรัคเตอรอยางละเอียดในหัวขอ 4.3) ทํ า การแสดงผลออบเจกต s ด ว ยคํ า สั่ ง ƒ ในบรรทั ด ที่ 4 System.out.println(s); คําสั่งนี้ออบเจกต s จะเรียกใชงานเมธอด toString() โดยอัตโนมัติ พิจารณาคําสั่งดังนี้ (โดยที่ s ยังคงเปนออบเจกตของคลาส Student)

ƒ ƒ

ในบรรทัดแรกของภาพขางบนที่มีการคอมเมนต ไมสามารถคอมไพลผานได เนื่องจาก str เปนขอมูลชนิด String และ s เปนขอมูลชนิด Student ในบรรทัดที่ 2 มีการเชื่อมตอขอมูลสตริงกับออบเจกต s เพราะฉะนั้น ออบ เจกต s จะเรียกใชงานเมธอด toString() อัตโนมัติ

คือการสืบทอดคุณสมบัติ เชน บัตรวีซา, บัตรมาสเตอรคารด, บัตร อเมริกันเอ็กซเพรส เปนบัตรเครดิต ซึ่งสามารถสรางคลาสของบัตรเครดิตเพื่อใหบัตรชนิดตางๆสืบ ทอดคุณสมบัติ กลาวคือ บัตรเครดิตประกอบไปดวยองคประกอบพื้นฐานรวมกัน อยางเชน เลขที่ บัตรเครดิต, ชื่อธนาคารที่ใหบริการ, วงเงินบัตรเครดิต และวันหมดอายุของบัตร เปนตน ซึ่งการ ออกแบบระบบที่ดีนั้น ควรที่จะออกแบบใหสามารถนํากลับมาใชใหมได (reuse) โดยไมตองสราง โค ดขึ้ น ใหม ซึ่ ง จะช ว ยทํ า ใหป ระหยัด เวลาในการทํา งาน หรื อ ถ า หากต อ งการแก ไ ขเพิ่ ม เติม ยั ง สามารถทําไดงายอีกดวย ในบทนี้จะเนนในเรื่องของการสืบทอดคุณสมบัติ

 Inheritance

[email protected]

(is

a)

2/31

Inheritance & Encapsulation

 Composition (has a)

Modern Programming Languages

กลาวคือออบเจกตของคลาส A ประกอบไปดวยออบเจกตของคลาส B

อยางเชน ƒ ƒ

องคประกอบของรถยนตประกอบขึ้นจากลอ, ประตู, เครื่องยนต ฯลฯ จุดเดนคือสามารถเปลี่ยนออบเจกตไดในขณะ runtime

คลาส Computer เปนตนแบบที่สรางไวเพื่อแสดงสวนประกอบตางๆ ของคอมพิวเตอร ซึ่งใน สวนประกอบตางๆยังสามารถสรางตนแบบของตัวมันเองไดอีกดวย โดยสามารถเขียนแสดงเปนคลาส ไดอะแกรมไดดังรูปดานลาง CPU float cpuSpeed; Computer

Ram

CPU cpu; Ram ram; HardDisk hardDisk; Monitor monitor;

int memSize; HardDisk int capacities; Monitor int monitorSize;

[email protected]

3/31

Inheritance & Encapsulation

ตัวอยาง คลาส

Modern Programming Languages

CPU, Ram, HardDisk

และ

Monitor

เปนองคประกอบของคลาส

Computer

โดยที่คลาส CPU ประกอบไปดวยตัวแปรออบเจกต cpuSpeed ซึ่งเปนชนิด int และเมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ CPU

โดยที่คลาส Ram ประกอบไปดวยตัวแปรออบเจกต memSize ซึ่งเปนชนิด int และเมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ Ram

โดยที่คลาส HardDisk ประกอบไปดวยตัวแปรออบเจกต capacities ซึ่งเปนชนิด int และ เมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ HardDisk

โดยที่คลาส Monitor ประกอบไปดวยตัวแปรออบเจกต moniterSize ซึ่งเปนชนิด int และเมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ Monitor

[email protected]

4/31

int

Inheritance & Encapsulation

Modern Programming Languages

เมื่อทําการคอมไพลและรันโปรแกรม Computer.java ผลลัพธที่ได

@

จากตัวอยางขางตน ทําการพิจารณาการทํางานของโปรแกรม o บรรทัดที่ 30-33 ทําการกําหนดตัวแปรออบเจกตของคลาส Computer สังเกตไดวา ตัวแปรเหลานี้เปนตัวแปรชนิดอางอิง (ตัวแปรชนิดคลาสนั่นเอง) o บรรทัดที่ 34-41 เปนการสรางเมธอด toString() เพื่อใชในการแสดงรายละเอียดที่ เปนขอมูลขององคประกอบเครื่องคอมพิวเตอรของคลาส Computer o บรรทัดที่ 43 สรางออบเจกตของคลาส Computer สรางออบเจกตของคลาส CPU ซึ่งเปนองคประกอบหนึ่งของ o บรรทัด ที่ 44 Computer โดยการสรางนั้นไมสามารถเรียกใชคําสั่งนี้ไดเลย cpu = new อยาลืมวาตัวแปรอางอิง cpu เปนตัวแปรออบเจกตของคลาส CPU(2.4f); Computer ดังนั้นการเรียกใชงานตองอางอิงชื่อออบเจกต com กอน คือ com.cpu = o o

cpu = new CPU(2.4f); บรรทัดที่ 45-47 การออบเจกตนี้คลายกับในบรรทัดที่ 44

บรรทัดที่ 48 ผลที่ได แสดงรายละเอียดขอมูลขององคประกอบเครื่องคอมพิวเตอร ที่ สรางในเมธอด toString()

[email protected]

5/31

Inheritance & Encapsulation

Modern Programming Languages

4.2 การสืบทอดคุณสมบัติ (Innheritance)

กล า วคื อ เราสามารถออกแบบโปรแกรมเพื่ อ สร า งคลาสต น แบบเพื่ อ ให ค ลาสอื่ น ๆ สามารถสื บ ทอด คุณสมบัติ (inherit) ได โดยทําการสืบทอดทั้งคุณลักษณะ (variable) และพฤติกรรม (method) โดยคลาส ตนแบบที่ยินยอมใหสืบทอดคุณสมบัติไดเรียกวา คลาสแม หรือ superclass หรือ parent class สําหรับคลาส ที่ทําการสืบทอดคลาสตนแบบนั้นเรียกวา คลาสลูก หรือ subclass หรือ child class ในการสืบทอดสามารถ แบงความตองการได คือ การสืบทอดโดยใชคุณสมบัติของคลาสแมที่มีอยู, การสืบทอดโดยการเรี ยกใช คุณลักษณะและพฤติกรรมบางสวนของคลาสแมเพื่อใหโปรแกรมทํางานไดตามตองการ และการสืบทอดโดย สามารถแกไขหรือเปลี่ยนแปลงคุณลักษณะและพฤติกรรมของคลาสแมได 4.2.1

คลาสแมและคลาสลูก • • • •

คลาสแม คือ คลาสที่ยินยอมใหคลาสอื่น สืบทอดคุณสมบัติ คลาสลูก คือ คลาสที่ทําการสืบทอดคุณสมบัติจากคลาสแม คลาสลูก จะไมสามารถสืบทอดคอนสตรัคเตอรของคลาสแม การสืบทอดทําไดโดยการใชคียเวิรด extends

รูปแบบ

Superclass extends

extends Subclass

จากรูปขางบน  Superclass ไมสามารถที่จะเรียกใชคุณลักษณะและเมธอดของ Subclass ได

สามารถที่จะเรียกใชคุณลักษณะและเมธอดของ Superclass ได ถา accessibility ของคุณลักษณะและเมธอดไมไดเปนแบบ private

 Subclass

[email protected]

6/31

Inheritance & Encapsulation

Modern Programming Languages

ตัวอยางคลาสตนแบบ SuperClass และ SubClass

จาก ตัวอยางคลาสตนแบบ SuperClass และ SubClass สามารถเขียนคลาสไดอะแกรมไดดังนี้ SuperClass int mySuper1 = 7; int mySuper2 = 9; extends SubClass int mySub1 = 10; int mySub2 = 20;

จาก ตั ว อย า งคลาสต น แบบ SuperClass SimpleInherit.java ดังดานลาง

[email protected]

และ SubClass นํ า มาเรี ย กใช ง านดั ง โปรแกรม

7/31

Inheritance & Encapsulation

Modern Programming Languages

ผลลัพธที่ได :

@

จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัด o บรรทัดที่ 3 ทําการออบเจกต sup ของคลาส SuperClass แสดงผลการสรางออบเจกตดังรูป ดานลาง 0xcac268 sup

SuperClass sup = new SuperClass(); mySuper1 = 7; mySuper2 = 9;

o

บรรทัดที่ 4 ทําการออบเจกต sub ของคลาส SubClass แสดงผลการสรางออบเจกตดังรูป ดานลาง ซึ่งจะเห็นไดวา ออบเจกต sub ประกอบไปดวยตัวแปรออบเจกตของคลาส SuperClass เนื่องจาก SubClass สืบทอดคุณสมบัติจาก SuperClass 0x1a16869 sub

SubClass sub = new SubClass(); mySub1 = 10; mySub2 = 20; mySuper1 = 7; mySuper2 = 9;

o o

บรรทัดที่ 6 เปนคําสั่งในการแสดงผลของออบเจกต sup Æ sup.showSuper() ซึ่งจะทําการ แสดงผลของตัวแปรออบเจกต mySuper1 และ mySuper2 บรรทัดที่ 8 เปนคําสั่งในการแสดงผลของออบเจกต sub Æ sub.showSub() ซึ่งจะทําการ แสดงผลของตัวแปรออบเจกต mySub1, mySub2, mySuper1 และ mySuper2

[email protected]

8/31

Inheritance & Encapsulation

Modern Programming Languages

จาก ตั ว อย า งคลาสต น แบบ SuperClass SimpleInherit.java ดังดานลาง

และ SubClass นํ า มาเรี ย กใช ง านดั ง โปรแกรม

ผลลัพธที่ได :

@

จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัด o บรรทัดที่ 3 และ 4 เปนการสรางออบเจกตดังตัวอยางขางตน ซึ่งใชงานคลาสตนแบบเดียวกัน คือ SuperClass และ SubClass o บรรทัดที่ 5 ทําการกําหนดคาใหกับ sub.mySuper1=700 สังเกตจากรูปดานลาง คําสั่งนี้เปน การกําหนดคาใหกับตัวแปร mySuper1 ที่อยูในออบเจกต sub o บรรทัดที่ 6 ทําการกําหนดคาใหกับ sub.mySuper2=900 สังเกตจากรูปดานลาง คําสั่งนี้เปน การกําหนดคาใหกับตัวแปร mySuper2 ที่อยูในออบเจกต sub 0x1a16869 sub

SubClass sub = new SubClass(); mySub1 = 10;

sub.mySuper1=700; sub.mySuper1=900;

mySub2 = 20; mySuper1 = 7; mySuper1 = 700; mySuper2 = 9; mySuper2 = 900;

[email protected]

9/31

Inheritance & Encapsulation

o

o

Modern Programming Languages

บรรทัดที่ 8 เปนคําสั่งในการแสดงผลของออบเจกต sup Æ sup.showSuper() จะทําการ แสดงผลของตัวแปรออบเจกต mySuper1 และ mySuper2 ซึ่งยังไมมีคําสั่งใดเปลี่ยนแปลงคา ในออบเจกต sup บรรทัดที่ 10 เปนคําสั่งในการแสดงผลของออบเจกต sub Æ sub.showSub() ซึ่งจะทําการ แสดงผลของตัวแปรออบเจกต mySub1, mySub2, mySuper1 และ mySuper2 มีการ เปลี่ยนแปลงคา mySuper1 และ mySuper2 ในออบเจกต sub คาที่แสดงออกมาจึงมีการ เปลี่ยนแปลง

4.3 คอนสตรัคเตอร (Constructor)

คอนสตรัคเตอรเปนเมธอดที่ประกอบดวยคําสั่งในการกําหนดคาเริ่มตนของคลาส โดยที่คอนสตรัคเตอรจะถูก เรียกใชงานเมื่อมีการสรางออบเจกตดวคียเวิรด new • คอนสตรัคเตอรเปนเมธอดพิเศษที่มีชื่อเดียวกับชื่อคลาส จะถูกเรียกใชงานเมื่อมีการสรางออบเจกต • คอนสตรัคเตอรเปนเมธอดที่ไมมีการสงคากลับ และไมตองระบุคียเวิรด void รูปแบบ



โดยทั่ ว ไปทุ ก คลาสจะต อ งมี ค อนสตรั ค เตอร แ ม จ ะไม มี ก ารกํ า หนดคอนสตรั ค เตอร ใ นโปรแกรม คอมไพเลอรจะทําการสรางคอนสตรัคเตอรที่ไมมีการทํางานอยูภายใน ใหโดยอัตโนมัติ เรียกวา “default constructor” เชน

เมื่อจะเรียกใชงานคลาสตองทําการสรางออบเจกตขึ้นมากอน ดังนี้

• •



การกําหนดคอนสตรัคเตอรขึ้นมาเองนั้น จะทําให “default constructor” หายไป ดังนั้นในการสราง ออบเจกต ตองการทําสงผานพารามิเตอรใหสอดคลองคอนสตรัคเตอรที่ทําการกําหนดขึ้นมาดวย หากมีการกําหนดคอนสตรัคเตอรขึ้นมาเพื่อกําหนดคาเริ่มตนใหกับออบเจกต แลวทําให “default constructor” หายไปนั้น ในการสรางออบเจกตในบางครั้งไมมีความจําเปนที่จะตองกําหนดคาเริ่มตน ใหกับออบเจกต เราสามารถสราง “default constructor” เองได โดยกําหนดคอนสตรัคเตอรที่มีการ สงผานคาพารามิเตอรเขา คอนสตรัคเตอรสามารถกําหนดไดหลายรูปแบบคือ มีการสงผานคาพารามิเตอรในแตละคอนสตรัคเตอรที่ แตกตางกัน เรียกวา overloading constructor นี่เปนลักษณะเดนอีกอยางหนึ่งของการเขียนโปรแกรม เชิงวัตถุ ทําใหสามารถทํางานไดหลายรูปแบบดวยการเรียกใชชื่อเดียวกัน ไมเพียงแตคอนสตรัคเตอร เทานั้นเมธอดอื่นๆก็สามารถเปนแบบ overloading ไดเหมือนกัน (กลางถึงในบทที่ 5)

[email protected]

10/31

Inheritance & Encapsulation

Modern Programming Languages

ตัวอยางที่ 1 คลาส Person

จาก ตัวอยางที่ 1 คลาส Person การสรางออบเจกตของคลาส Person ทําไดดังนี้

)9 โดยจากตัวอยางขางตน พารามิเตอรที่สงเขาคอนสตรัคเตอรตัวแรกตองเปน String และตัวที่สองตอง เปน int จาก ตัวอยางที่ 1 คลาส Person ไมสามารถสรางออบเจกตดังขางลางได เนื่องจากพารามิเตอรไม สอดคลองกับคอนสตรัคเตอรที่กําหนด

)2 ตัวอยางที่ 2 คลาส Person

จาก ตัวอยางที่ 2 คลาส Person ประกอบไปดวย 2 คอนสตรัคเตอร เรียกวา overloading constructor ซึ่งจะทําใหสามารถสรางออบเจกตของคลาส Person ได 2 แบบ โดยมีการกําหนด ใหมี “default constructor” และคอนสตรัคเตอรที่ผูเขียนโปรแกรมออกแบบไวใหกําหนดคาเริ่มตนใหกับตัวแปร ออบเจกตคือ name และ age แบบที่ 1 : การสรางออบเจกตแบบนี้ ตัวแปรออบเจกตจะถูกกําหนดคาเริ่มตนโดยจาวา

)9 แบบที่ 2 : การสรางออบเจกตแบบนี้ ตัวแปรออบเจกตจะถูกกําหนดโดยผูเขียนโปรแกรมเปน ผูสรางขึ้น

)9 [email protected]

11/31

Inheritance & Encapsulation

• •



Modern Programming Languages

ทบทวน!!! เมื่อทําการสรางออบเจกต โดยคียเวิรด new สิ่งที่เกิดขึ้น คือ มีการจองพื้นที่หนวยความจํา เพื่อเก็บขอมูลของออบเจกต มีกําหนดคาเริ่มตนใหกับตัวแปรของออบเจกต – ตัวแปรที่เปนตัวเลขและตัวอักขระ(char) เปน 0 – ตัวแปรที่เปน boolean เปน false – ตัวแปรออบเจกต เปน null มีการเรียกใชเมธอดพิเศษ(constructor)

ตัวอยาง การเรียกใชงานคอนสตรัคเตอรที่มีการสืบทอดคุณสมบัติ จากคลาสไดอะแกรมดานลาง ประกอบดวยคลาส Child, Parent และ GrandParent โดยมีการสืบทอดเปนลําดับ คือ คลาส Child สืบทอด คุณสมบัติ คลาส Parent และ คลาส Parent สืบทอดคุณสมบัติจากคลาส GrandParent ดังนั้นคลาส Child จะได คุณสมบัติจากคลาส GrandParent มาดวย GrandParent extends Parent extends Child

โปรแกรมตอไปนี้แสดงการสืบทอดคุณสมบัติ แสดงดังคลาสไดอะแกรมขางตนที่กลาวมาแลว โดยในแต ละคลาสกําหนดใหภายใน “default constructor” มีคําสั่งของการแสดงผลขอความอยูในแตละคลาสดวย

จากโปรแกรมขางตนทําการสรางออบเจกต children ชนิดคลาส Child ดังนี้

[email protected]

12/31

Inheritance & Encapsulation @

Modern Programming Languages

จากตัวอยางขางตน ทําการพิจารณาโดยคํานึงถึงคุณสมบัติการสืบทอด o บรรทัดที่ 3 เปนการสรางออบเจกต children ในคลาส Child นั้นกําหนดคอนสตรัคเตอรให แสดงขอความดวย ดังนั้นการสรางออบเจกต children จะไปเรียกคอนสตรัคเตอรของคลาส Child ดวย แตเนื่องจากคลาส Child สืบทอดคุณสมบัติจากคลาส Parent กลาวคือ ถาคลาส แมไมถูกเรียกใชงานคอนสตรัคเตอรขึ้นมา จะเกิดมีคลาสลูกไดอยาไร ทําใหกอนการเรียกคอน สตรัคเตอรของคลาส Child จะทําการเรียก คอนสตรัคเตอรของคลาส Parent กอน ซึ่งหาก พิจารณาตอไปอีกคลาส Parent สืบทอดคุณสมบัติจากคลาส GrandParent ดังนั้นกอนสราง ออบเจกต Parent ตองไปเรีกใชงานคอนสตรัคเตอรของคลาส GrandParent กอน o ผลที่ได คือคลาสที่ยิ นยอมใหคลาสอื่น สืบทอดและอยูสูงสุ ด จะตองถู กเรียกใชงานคอนสตรั ค เตอรขึ้นกอนเสมอ o ทําใหผลการแสดงขอมูลที่ไดทําการเรียกใชงานคอนสตรัคเตอรของคลาส GrandParent ซึ่งอยู บนสุด แลวไลลงมาจนถึงคอนสตรัคเตอรของคลาส Child ที่อยูลางสุด

ผลลัพธที่ได :

4.4 คียเวิรด super และ this •

super

ใชในการอางอิงถึงคลาสแม เพื่อที่จะเรียกใชคุณลักษณะหรือ เมธอดหรือคอนสตรัคเตอรของ

คลาสแม super.methodName(parameters); super(parameters); อางอิงถึง คอนสตรัคเตอร •

this ใชในการอางถึงคลาสของตัวเอง(คลาสลูก) เพื่อเรียกใชคุณลักษณะหรือเมธอดของคลาสตัวเอง this.varName; this.methodName(parameters);

ตัวอยาง การเรียกใชคียเวิรด super

[email protected]

13/31

Inheritance & Encapsulation

Modern Programming Languages

ทําการพิจารณาพิจารณาในกรอบที่ครอบคลุมบรรทัดที่ 13 และ 14 จะเห็นวาคําสั่งในสองบรรทัด เหมือนกับคําสั่งที่อยูในเมธอด showSuper() ที่อยูในคลาส SuperClass และเปนคลาสแมดวย เพื่อไมตอง เขียนคําสั่งที่ซ้ําซอน สามารถใชคียเวิรดในการเรียกใชงานเมธอด showSuper() ที่อยูในคลาสแมไดดังนี้

ตัวอยาง การมีตัวแปรออบเจกตของคลาสแมและคลาสลูกที่มีชื่อเหมือนกัน ParentClass int a; super.a

extends BaseClass

this.a

int a;

ผลลัพธที่ได :

@

จากตัวอยางขางตน ทําการพิจารณาโปรแกรมดังนี้ o บรรทัดที่ 5 เนื่องจากโปรแกรมมีชื่อตัวแปรเหมือนกันทั้งในคลาสแมและลูก ดังนั้นจะกําหนดคา ใหกับตัวแปรของคลาสไหน ตองใชคียเวิรด super และ this เขาชวย จากโปรแกรมการเรียก คําสั่ง super.a เปนการอางถึงขอมูลที่อยูในคลาส ParentClass สวนการเรียกคําสั่ง this.a เปน การอางถึงขอมูลที่อยูในคลาส BaseClass o ในเมธอด showAll() เชนกัน การจะแสดงผลจะตองระบุวาจะเลือกแสดงตัวแปรชื่อ a ของ คลาสไหน

[email protected]

14/31

Inheritance & Encapsulation

Modern Programming Languages

ตัวอยาง การสืบทอดคุณสมบัติและคอนสตรัคเตอร Person String name; char sex;

extends Student

Teacher

สังเกตวาคลาส Person มีคอนสตรัคเตอรการกําหนดใหรับพารามิเตอร ดังนั้น ในการสรางออบเจกต Person จะตองสงผานคาพารามิเตอร ใหสอดคลองกันดวย

ถาหากวาคลาส Person สรางคอนสตรัคเตอรที่มีการสงพารามิเตอรเขาดังนี้ Person(String name, char sex)

ใหสังเกตวาชื่อตัวแปรที่ใชเก็บคาพารามิเตอรที่สงเขามานั้น มีชื่อเหมือนกับตัวแปรออบเจกต ดังนั้นใน การกําหนดคาเริ่มตนในเมธอดพิเศษนี้ จะตองมีการระบุวาตองการเก็บคาใหกับตัวแปรออบเจกต ไมเชนนั้น จะถูกมองวาเปนตัวแปรโลคอล สามารถใชงานไดในเมธอดเทานั้น จะไมมองวาเปนการกําหนดคาใหกับตัว แปรออบเจกต สามารถทําไดดังนี้ Person(String name, char sex) { this.name = name; this.sex = sex; }

คียเวิรด this เปนตัวระบุวาตองการกําหนดคาใหกับตัวแปรออบเจกต ของคลาส Person

[email protected]

15/31

Inheritance & Encapsulation

Modern Programming Languages

คลาส Teacher และ Student ทําการสืบทอดคุณสมบัติของคลาส Person จากตัวอยางการเรียกใชงาน คอนสตรัคเตอรที่มีการสืบทอดคุณสมบัตินั้น จะเห็นไดวาถาคลาสแมไมถูกเรียกใชงานคอนสตรัคเตอรขึ้นมา จะไมเกิดคลาสลูก ดังนั้นคอนสตรัคเตอรของคลาส Teacher และ Student จะตองเรียกใชงานคอนสตรัคเตอร ของคลาส Person และจะตองสงคาพารามิเตอรใหสอดคลองกับคลาสแมดวย เพราะวาถาไมเรียกคอนสตรัค เตอรของคลาสแมจะไมสามารถคอมไพลผานได

จากโปรแกรม School.java ทําการเรียกใชงานคลาส Teacher และ Student

ผลลัพธที่ได :

@

จากตัวอยางขางตน ทําการพิจารณาโปรแกรมดังนี้ o บรรทัดที่ 8 และ 11 ทําการแสดงผลออบเจกต t และ s เนื่องจากคลาส Person มีการกําหนด เมธอด toString() (ไดทําการกลาวถึงเมธอดนี้ไปลวในขางตน วาเปนเมธอดที่ใชสําหรับแปลง ออบเจกตใหเปน String) จากโปรแกรมนี้ System.out.println(t); จะถูกเรียกใชเปน System.out.println(t.toString()); โดยอัตโนมัติ

[email protected]

16/31

Inheritance & Encapsulation

o o

Modern Programming Languages

โดยทั่วไปคําสั่งแสดงผลออบเจกต จะแสดงผลเปนชื่อคลาสและตําแหนงหนวยความจําของออบ เจกตนั้น หากทําการคอมเมนตเมธอด toString() ในคลาส Person แลวผลที่ไดเปนดังนี้

4.5 การซอนรายละเอียด (Encapsulation) •

Encapsulation คือการปองกันไมใหออบเจกตภายนอกเขาถึงขอมูลไดอยางอิสระ สามารถทําไดดังนี้ o o

4.5.1

การรวบรวมคุณลั กษณะและเมธอด มารวมอยูใ นที่เดียวกั น ซึ่งเรีย กวา เปน การจัดเก็บใน ลักษณะของแพ็คเกจ (package) กําหนดกลไกในการเขาถึงตัวแปร, เมธอดและคลาส โดยใชคียเวิรด public, private และ protected ถาไมระบุจะถือวาเปน default

กลไกในการเขาถึงตัวแปร, เมธอดและคลาส



public ทุกคลาสสามารถเรียกใชงานได



private สามารถเรียกใชงานไดเฉพาะในคลาสของตัวเอง



protected สามารถเรียกใชงานไดในแพ็คเกจเดียวกัน และเปน subclass ของคลาสที่อยูตางแพ็คเกจ



default สามารถเรียกใชงานไดในแพ็คเกจเดียวกันเทานั้น

กลไกในการเขาถึงสามารถสรุปไดดังตารางตอไปนี้ subclass

non-subclass

คียเวิรด same pack

4.5.2

difference pack

same pack difference pack

private

2

2

2

2

protected

9

9

9

2

public

9

9

9

9

default

9

2

9

2

แพ็คเกจ (Package)

การรวบรวมคลาสและอินเตอรเฟซตางๆ ที่เกี่ยวของกันไวในที่เดียวกัน เพื่อความสะดวกในการเรียกใชงาน ในหนึ่งแพ็คเกจสามารถมีไดหลายคลาส • package มาตรฐานของ Java API ที่ควรรูจัก o java.lang เก็บคลาสที่มากับภาษา (Built-in) แพ็คเกจนี้ไมตอง import o java.applet เก็บคลาสเกี่ยวกับ applet o java.awt เก็บคลาสเกี่ยวกับ GUI ไมรวม swing

[email protected]

17/31

Inheritance & Encapsulation

4.5.3

Modern Programming Languages

o

java.io เก็บคลาสเกี่ยวกับการจัดการอินพุต, เอาตพุตและไฟล

o

java.net เก็บคลาสเกี่ยวกับการโปรแกรมเน็ตเวิรค

o

java.util เก็บคลาสเกี่ยวกับ utility ซึ่งโปรแกรมทั่วไปตองใช

โครงสรางโปรแกรมของภาษาจาวา



package_declaration เปนการระบุวาโปรแกรมอยูในแพ็คเกจใด



หากไมมีการระบุ package คอมไพเลอรจะใหคลาสนั้นอยูใน default package คือ directory ปจจุบันที่ใชงานคลาสนั้น import_declaration เปนคําสั่งในการเรียกใชแพ็คเกจอื่น o แพ็คเกจ java.lang ไมจําเปนตอง import เพราะ buit-in มาใหแลว class_declaration เปนคําสั่งในการประกาศคลาส o



4.5.4 ¾ ¾

การสรางแพ็คเกจ การสรางแพ็คเกจจะใชคียเวิรด package โดยจะประกาศไวในตอนตนของโปรแกรม โปรแกรมหนึ่งสามารถมีคําสั่ง package ไดเพียงคําสั่งเดียว

รูปแบบ เชน

4.5.5 • •

การใชงานแพ็คเกจ การเรียกใชงานแพ็คเกจ ทําไดโดยใชคียเวิรด import กําหนดไวกอนประกาศคลาส ในหนึ่งโปรแกรมสามารถมีคําสั่ง import ไดหลายค่ําสั่ง

รูปแบบ

หรือ

[email protected]

18/31

Inheritance & Encapsulation

Modern Programming Languages

เชน

ตัวอยาง การสรางแพ็คเกจ

ผลลัพธที่ได : เมื่อทําการคอมไพล กลาวคือจะมีการสรางโฟลเดอร firstpack และมีไฟลนามสกุล .class อยูในโฟลเดอรนั้น ตัวอยาง การเรียกใชแพ็คเกจ firstpack

กอนการรันโปรแกรม AccountBalance.java ตองยายไฟล Balance.java เพราะเมื่อ import firstpack.*; เพื่อเรียกใชคลาส Balance ทําใหเกิดความซ้ําซอน คอมไพเลอรแจงวาหา Balance.class ไม เจอ แสดงดังรูปดานลาง

[email protected]

19/31

Inheritance & Encapsulation

Modern Programming Languages

ผลลัพธที่ได :

ตัวอยาง การสรางแพ็คเกจ mypack ประกอบดวยคลาส Protection, Derived และ SamePackage ดูไดอะแกรมขางลาง จะเห็นวาคลาส Protection มีตัวแปรออบเจกตชนิด int ที่กําหนดกลไกในการเขาถึงขอมูล แตกตางกัน และคลาส Derived สืบทอดคุณสมบัติของคลาส Protection สวนคลาส SamePackage เปนคลาส หนึ่งที่อยูในแพ็คเกจ mypack mypack Protection public int npub = 111 ; protected int n_pro = 222; int n = 333 ; private int n_pri=444 ; extends Derived SamePackage

จากคลาส Protection สังเกตไดวา สามารถเรียกใชตัวแปรไดทุกตัว ในคลาสของตัวเอง

[email protected]

20/31

Inheritance & Encapsulation

Modern Programming Languages

จากคลาส Derived สังเกตไดวา ตัวแปรที่กําหนดเปน private ไมสามารถไดรับการสืบทอดคุณสมบัติ ได

เมื่อทําการเรียกใชออบเจกต p ในคลาส SamePackage สังเกตไดวา ตัวแปรที่กําหนดเปน private ไม สามารถเรียกใชได

ผลลัพธที่ได : จากการคอมไพล

[email protected]

21/31

Inheritance & Encapsulation

Modern Programming Languages

จากโปรแกรม DemoMypack.java ทําการ เมื่อ import mypack.*; เพื่อเรียกใชงานคลาสทั้งสามที่อยู ในแพ็คเกจนี้

ผลลัพธที่ได :

@

จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัดตั้งแตบรรทัดที่ 4-6 วาผลลัพธที่ไดเปนอยางไร โดย คํานึงถึงการสืบทอดคุณสมบัติ และคอนสตรัคเตอร o บรรทัดที่ 4 เปนการสรางออบเจกต Protection ob1 = Protection(); ผลที่ไดเปนการแสดง คําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection ผลลัพธที่ได :

o

บรรทัดที่ 5 เปนการสรางออบเจกต Derived ob2 = Derived(); เนื่องจากคลาส Derived สืบ ทอดคุณสมบัติคลาส Protection ผลที่ไดจึงเรียกใชงานคําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection กอน จากนั้นจึงเรียกใชคอนสตรัคเตอรคลาส Derived

[email protected]

22/31

Inheritance & Encapsulation

Modern Programming Languages

ผลลัพธที่ได :

o

บรรทัดที่ 6 เปนการสรางออบเจกต SamePackage ob3 = SamePackage(); ) ในคอนสตรัค เตอรของคลาส SamePackage บรรทัดแรกในคอนสตรัคเตอรมีการเรียกใชงานคลาส Protection (สรางออบเจกตของคลาส Protection นั่นเอง) ดังนั้นจะแสดงคําสั่งที่อยูในคอน สตรัค เตอรคลาส Protection ก อน แลวจึงแสดงผลขอความอื่น ที่อยูในคอนสตรัคเตอรข อง คลาส SamePackage เอง ผลลัพธที่ได :

ตัวอยาง การสรางแพ็คเกจ anotherpack ประกอบดวยคลาส AnotherProtection และ OtherPackage ดูไดอะแกรมหนาถัดไป จะเห็นวาคลาส AnotherProtection สืบทอดคุณสมบัติของคลาส Protection ที่อยูในแพ็คเกจ mypack ที่ไดทําการสรางไวขางตน สวนคลาส OtherPackage เปนคลาสหนึ่งที่อยู ในแพ็คเกจ anotherpack mypack Protection extends

anotherpack AnotherProtection

public int npub = 111 ; protected int n_pro = 222; int n = 333 ; private int n_pri=444 ; extends

OtherPackage Derived SamePackage

[email protected]

23/31

Inheritance & Encapsulation

Modern Programming Languages

จากโปรแกรมคลาส AnotherProtection สืบทอดคุณสมบัติจากคลาส Protection ซึ่งอยูตาง แพ็คเกจกัน ทําใหไมสามารถเรียกใชตัวแปรที่เปน default และ private ได

เมื่อคลาสอยูตางแพ็คเกจกัน และไมไดเปน subclass กําหนดการเขาถึงเปน public เทานั้น

ผลลัพธที่ได :

สามารถเรียกใชงานไดเฉพาะตัวแปรที่

จากการคอมไพล

[email protected]

24/31

Inheritance & Encapsulation

Modern Programming Languages

จากโปรแกรม DemoAnotherpack.java ทําการ เมื่อ import anotherpack.*; เพื่อเรียกใชงานคลาส ทั้งสองที่อยูในแพ็คเกจนี้

ผลลัพธที่ได :

@

จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัดตั้งแตบรรทัดที่ 4-5 วาผลลัพธที่ไดเปนอยางไร โดย คํานึงถึงการสืบทอดคุณสมบัติ และ constructor o บรรทัดที่ 4 เปนการสรางออบเจกต AnotherProtection ob1 = AnotherProtection(); Derived(); เนื่องจากคลาส AnotherProtection สืบทอดคุณสมบัติคลาส Protection ซึ่งอยู ในแพ็คเกจ mypack ผลที่ไดจึงเรียกใชงานคําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection กอน จากนั้นจึงเรียกใชคอนสตรัคเตอรคลาส AnotherProtection ผลลัพธที่ได :

o

บรรทัดที่ 5 เปนการสรางออบเจกต OtherPackage ob2 = OtherPackage(); ) ในคอนสตรัค เตอรของคลาส OtherPackage บรรทัดแรกในคอนสตรัคเตอรมีการเรียกใชงานคลาส Protection ซึ่งอยูในแพ็คเกจ mypack (สรางออบเจกตของคลาส Protection นั่นเอง) ดังนั้น จะแสดงคําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection กอน แลวจึงแสดงผลขอความอื่นที่อยู ในคอนสตรัคเตอรของคลาส OtherPackage เอง

[email protected]

25/31

Inheritance & Encapsulation

Modern Programming Languages

ผลลัพธที่ได :

[email protected]

26/31

Inheritance & Encapsulation

Modern Programming Languages

แบบฝกหัด 1.

สรางโปรแกรม PrettyGirl.java ทําการสืบทอดคุณสมบัติจากคลาส Person จงแกไขใหโปรแกรมสามารถแสดงผลไดดังนี้

จากผลที่ได กําหนดชื่อ Ann อายุ 19

ขอกําหนด :

ตัวแปรออบเจกต name และ age ตองเปนกําหนดเปน private หามแกไขชื่อพารามิเตอรที่สงเขาคอนสตรัคเตอรของคลาส Person

[email protected]

27/31

Inheritance & Encapsulation

2.

Modern Programming Languages

จากขอ 1. สรางคลาส SmartBoy สืบทอดคุณสมบัติจากคลาส Person โดยที่คลาส SmartBoy มีตัวแปร ออบเจกตเปนตัวแปรอางอิงของคลาส PrettyGirl และทําการกําหนดคา เริ่มตนใหกับออบเจกตของ PrettyGirl ในคอนสตรัคเตอร เพื่อความเขาใจเขียนคลาสไดอะแกรมไดดังนี้ Person private String name; private int age; extends

PrettyGirl

SmartBoy PrettyGirl girl;

เมื่อสรางคลาส SmartBoy ไดแลว ใหเพิ่มโปรแกรมสามารถแสดงผลไดดังนี้ (โดยทําการเพิ่มในเมธอด main ในคลาส PrettyGirl)

3.

สรางโปรแกรม Company.java โดยประกอบไปดวยคลาสดังนี้ Employee public Employee(String name,String lastName) String name; String lastName; extends Manager

extends Secretary

เมื่อทําการรันโปรแกรมแลวใหไดผลดังนี้ ผลที่ได :

[email protected]

28/31

Inheritance & Encapsulation

[email protected]

Modern Programming Languages

29/31

Inheritance & Encapsulation

Modern Programming Languages

Employee public Employee(String n,String l,float f) void raiseSalary(int percent) float getSalary() String name; String lastName; private float salary; extends

extends

Secretary Manager

public Secretary(String n, String l,float s, Manager m) Manager m;

จากรูปคลาสไดอะแกรมดานบน ใหทําการเพิ่มเติมดังนี้ 1. ทําการเพิ่มตัวแปรเงินเดือนในคลาส Employee เปนชนิด float กํานหนดเปน private 2. เมื่อทําการแสดงผล ใหเพิ่มการแสดงผลในสวนของเงินเดือนดวย 3. ใหทําการเพิ่มเมธอด raiseSalary(int percent) ในการเพิ่มเงินเดือนในคลาส Employee

[email protected]

30/31

Inheritance & Encapsulation

Modern Programming Languages

4. ในสวนของคลาส Secretary ใหเพิ่มตัวแปรของออบเจกต เพื่อแสดงวาใครเปน Manager ของ Secretary คนนั้น โดยกําหนดคาเริ่มตนใหกับออบเจกตของ Manager ในคอนสตรัคเตอร 5. ใหลองทําการขึ้นเงินเดือนให Secretary จํานวน 10% โดยเรียกเมธอด raiseSalary(int percent)

ตัวอยางของผลที่ได เปนดังนี้

4.

จากโปรแกรม Company.java ใหทําการสราง Manager 5 คน โดยมีรายละเอียดดังนี้ 1. คนที่ 1 ชื่อ Helen นามสกุล Hunt เงินเดือน 50,000 2. คนที่ 2 ชื่อ Kenny นามสกุล Grants เงินเดือน 60,000 3. คนที่ 3 ชื่อ Citra นามสกุล White เงินเดือน 55,000 4. คนที่ 4 ชื่อ Jane นามสกุล Browns เงินเดือน 70,000 5. คนที่ 5 ชื่อ Billy นามสกุล Lighten เงินเดือน 65,000 โดยทําการสรางเรียงตามลําดับขางตน จากนั้นทําการเรียงลําดับ Manager ตามเงินเดือน เรียงลําดับจากมากไป นอย ในการแสดงผลใหแสดงทั้งชื่อ, นามสกุล และเงินเดือน

[email protected]

31/31

Related Documents

Chap04
November 2019 5
Chap04-idr
June 2020 7
Solutions Chap04
November 2019 1
Chap04[1]
November 2019 6
Ufa#ed2#sol#chap04
November 2019 7
Mkt Mgt # Chap04
December 2019 14