Chap06

  • 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 Chap06 as PDF for free.

More details

  • Words: 2,107
  • Pages: 25
Abstract & Interface

Modern Programming Languages

6

คลาสแบบ abstract และ อินเตอรเฟส(Interface) คลาสแบบ abstract และ อินเตอรเฟส(Interface) ในภาษาจาวาสามารถสรางตนแบบคลาสขึ้นมา โดยที่เมธอดภายในคลาสนั้น ไมตองมีการกําหนดคําสั่งการ ทํางานในเมธอดขึ้นมากอนเลย แตจะอาศัยการสืบทอดคุณสมบัติคือ คลาสลูกจะกําหนดคําสั่งในการทํางานใหกับ เมธอดที่ทําการสืบทอดมาจากคลาสตนแบบ โดยวิธีการนี้สามารถสรางเมธอดที่ไมสามารถกําหนดการทํางานไว ลวงหนาได เปนเพียงเมธอดที่คลาสลูกสามารถเรียกใชไดในชื่อเดียวกัน โดยสามารถกําหนดตนแบบคลาสลักษณะ นี้ไดสองแบบคือคลาสแบบ abstract และอินเตอรเฟส ซึ่งวิธีการทั้งสองสามารถกําหนดลําดับขั้นตอนไดดังนี้ • คลาสแมกําหนดรายละเอียดที่คลาสลูกสามารถเรียกใชงานเมธอดไดในชื่อเดียวกัน แตยังไมสามารถระบุ รายละเอียดของการทํางานในเมธอดได เชน การหาพื้นที่ของรูปทรงตางๆ จะมีการคํานวณที่แตกตางกัน ไป ทําใหไมสามารถกําหนดรายละเอียดการทํางานได • เมื่อตองการใหคลาสลูก สามารถเรียกใชไดในชื่อเมธอดเดียวกัน คลาสลูกจะกําหนดวิธีทํางาน เชน o คลาส Shape เปนคลาสแม มีเมธอด area() ที่ไมสามารถระบุรายละเอียดการทํางานได o คลาส Circle และ Rectangle ทําการสืบทอดคุณสมบัติคลาส Shape เพื่อกําหนดการทํางานใน เมธอด area() ในคํานวณหาพื้นที่ของรูปทรงแตละชนิด 6.1 คลาสแบบ abstract

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

โดยที่ className คือชื่อคลาสที่กําหนดเปนคลาสแบบ abstract รูปแบบ เมธอดแบบ abstract

โดยที่ -

คือชื่อเมธอดที่กําหนดเปนเมธอดแบบ abstract รายละเอียดการทํางาน ปดทายดวยเครื่องหมาย ; (semicolon) methodName

[email protected]

โดยไมกําหนด

1/25

Abstract & Interface

• •

Modern Programming Languages

-

returnType ชนิดขอมูลที่ทําการสงคากลับ

-

parameter คือการกําหนดพารามิเตอรในการรับคาเขาของเมธอดแบบ abstract

เมธอดแบบ abstract คือการสรางตนแบบเมธอดใหเรียกใชงานในชื่อเดียวกัน แตไมระบุรายละเอียดการ ทํางาน ถาประกาศคลาสแบบ abstract แลวไมจําเปนตองมีเมธอดแบบ abstract ภายในคลาส ยกตัวอยาง ดังตอไปนี้

จากตัวอยางโคดดานบนสามารถคอมไพลผาน แตอยาลืมวา เมื่อประกาศเปนคลาสแบบ abstract จะไม สามารถสรางออบเจกตได เมื่อตองการใชงานตัวแปรและเมธอด จะตองสรางคลาสขึ้นมาทําการสืบทอดคุณสมบัติ คลาสแบบ abstract เทานั้น เชน



คลาสแบบ abstract ไมสามารถสรางออบเจกตได แตสามารถเปนตัวแปรชนิดอางอิงไดดังนี้

จากตัวอยางขางบน คือ การ upcasting นั่นเอง ยกตัวอยาง

abstract class Shape

[email protected]

2/25

Abstract & Interface

Modern Programming Languages

จากตัวอยางโคดดานบน คลาส Shape ถูกกําหนดเปนคลาสแบบ abstract ประกอบดวย เมธอด area() ซึ่งเปน เมธอดแบบ abstract abstract class Shape String name; abstract double area(); String getName() public String toString() extends

Circle

Rectangle

Circle(double r)

Rectangle(double w,double h)

double radius;

double width double height

double area()

double area()

จากคลาสไดอะแกรมดานบน ทําการสรางคลาส Circle และ Rectangle ทําการสืบทอดคุณสมบัติคลาส Shape ดังนี้

ในคลาส Circle และ Rectangle ตางก็มีเมธอด area() เพื่อระบุการทํางาน นั่นก็คือการคํานวณพื้นที่ของ รูปทรงแตละชนิดนั่นเอง สวนในคลาส Shape นั้น มีเมธอด area() เปนเมธอดที่บอกวาในแตละคลาสที่ทําการสืบ

[email protected]

3/25

Abstract & Interface

Modern Programming Languages

ทอดคลาส Shape มีการทํางานในเมธอด area() ที่แตกตางกันไป จะเห็นไดวาเมธอด area() ในคลาส Circle และ Rectangle เปนเมธอดแบบ Overriding นั่นเอง สรางโปรแกรม AbstractClass.java เพื่อทําการเรียกใชงานคลาส

Circle และ Rectangle

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

พิจารณาจากโปรแกรม AbstractClass.java o บรรทัดที่ 34 : ทําการคอมเมนตไว เนื่องจากคลาส Shape เปนคลาสแบบ abstract ไม สามารถสรางออบเจกตได o บรรทัดที่ 35 สรางออบเจกต c เปนออบเจกตของคลาส Circle แตมีชนิดตัวแปรอางอิงเปน ชนิด Shape แสดงใหเห็นวาเปนไปตามขอกําหนดที่วาคลาสแบบ abstract ไมสามารถสราง ออบเจกตได แตสามารถเปนตัวแปรชนิดอางอิง @cac268 c

o

name

Circle

radius

2

บรรทัดที่ 36 สรางออบเจกต r เปนออบเจกตของคลาส เปนชนิด Shape

Rectangle

ซึ่งมีชนิดตัวแปรอางอิง

@32A3B89 r

[email protected]

name

Rectangle

width

2

height

2

4/25

Abstract & Interface

o

Modern Programming Languages

บรรทัดที่ 37 แสดงคาออบเจกต c คําสั่งนี้เปรียบเสมือน System.out.println(c.toString()) ดังนั้นจะแสดงคาที่เมธอด toString สงคากลับมา ซึ่งเมธอด toString() นี้อยูในคลาส Shape ซึ่งเปนคลาสที่คลาส Circle ทําการสืบทอดคุณสมบัติอยู

โดยภายในเมธอด toString() มีการเรียกใชงานเมธอด area() อยูดวย การเรียกใชเมธอด area() นี้ จะไปเรียกใชงานที่คลาสไหน ขึ้นอยูกับออบเจกตที่เรียกใชดวย คือในบรรทัดที่ 37 จะทํา การเรียกใชเมธอด area() ที่อยูในคลาส Circle o บรรทัดที่ 38 แสดงผลออบเจกต r คําสั่งนี้เปรียบเสมือน System.out.println(c.toString()) จะทําการเรียกใชเมธอด area() ที่อยูในคลาส Rectangle 6.2 อินเตอรเฟส (Interface)

อินเตอรเฟสมีลักษณะคลายกับคลาสแบบ abstract แตจะประกอบดวยเมธอดที่ไมมีการระบุรายละเอียดการ ทํางาน อาศัยการสืบทอดคุณสมบัติ เพื่อแยกอินเตอรเฟสออกจากการทํางาน คือทําใหสามารถสงเมธอดตางๆ ทํางานโดยไมตองสัมผัสงานโดยตรง ประโยชนคืออินเตอรเฟสสามารถกําหนดรูปแบบเมธอดตางๆ ที่คลาสอื่นๆ สามารถเรียกใชงานไดในชื่อเมธอดเดียวกัน ซึ่งตรงนี้จะอาศัยคุณสมบัตขิ องการใชงานไดหลายรูปแบบเขามาใชอีก ดวย และสามารถกลาวไดวาอินเตอรเฟสไมใชคลาส แตเปนการสราง template ไมมีการระบุการทํางานของ เมธอดตางๆที่อยูในอินเตอรเฟส การสรางอินเตอรเฟสมีขอกําหนดดังนี้ • อินเตอรเฟสมีสิ่งที่เหมือนกับคลาสแบบ abstract คือไมสามารถสรางออบเจกตได • การสรางอินเตอรเฟสตองใชคียเวิรด interface แทน class

โดยที่ interfaceName คือชื่อของอินเตอรเฟส •

การสรางเมธอดในอินเตอรเฟส จะไมมีการระบุการทํางาน โดยจะปดทายเมธอดดวยเครื่องหมาย ; (semicolon) ไมตองกําหนดกลไกในการเขาถึง (accesibility) เนื่องจากเมธอดในอินเตอรเฟสเปน public โดยอัตโนมัติ

โดยที่ -

คือชื่อเมธอดที่กําหนดภายในอินเตอรเฟส โดยไมกําหนดรายละเอียดการ ทํางาน ปดทายดวยเครื่องหมาย ; (semicolon) returnType ชนิดขอมูลที่ทําการสงคากลับ parameter คือการกําหนดพารามิเตอรในการรับคาเขาของเมธอด methodName

[email protected]

5/25

Abstract & Interface • •

Modern Programming Languages

ตัวแปรที่กําหนดขึ้นในอินเตอรเฟสเปน static และ final โดยอัตโนมัติ ดังนั้นตองมีการกําหนดคาเริ่มตน เสมอ การใชงานอินเตอรเฟส ทําไดโดยใชคียเวิรด implements เมื่อทําการ implements อินเตอรเฟสจะตอง ระบุเมธอดตางๆ ที่อยูในอินเตอรเฟสใหครบ อยาลืมวาเมธอดภายในอินเตอรเฟสเปน public ดังนั้นเมื่อ คลาสใดทําการ implements อินเตอรเฟสแลว การสรางเมธอดในคลาสนั้นจะตองระบุเมธอดเปน public ดวย เชน ทําการสรางอินเตอรเฟส Shape ดังนี้

เมื่อสรางคลาส Circle ทําการ implements อินเตอรเฟส Shape ในคลาส Circle จะตอง ประกอบดวยทุกๆเมธอดที่อยูในอินเตอรเฟส Shape และจะตองกําหนดเปน public ดวย แสดงการสราง ไดดังนี้

จากการสรางคลาส Circle ดังขางตน สังเกตไดวา ถึงแมเมธอด draw() ไมตองการระบุการ ทํางาน แตเนื่องจากตองเปนไปตามขอกําหนดของการ implements อินเตอรเฟส จึงตองสรางเมธอด draw() ขึ้นมาโดยการสรางบล็อค { } แตไมไดระบุการทํางานภายในบล็อค ซึ่งเปนการหลอกใหตัว คอมไพลรูวาเราสรางขึ้นมาเพื่อระบุการทํางานแลว เพื่อทําใหสามารถคอมไพลผาน

[email protected]

6/25

Abstract & Interface

Modern Programming Languages

ตัวอยางโปรแกรมการใชงานอินเตอรเฟส

[email protected]

7/25

Abstract & Interface

Modern Programming Languages

interface RemoteControl

int sleepTime[] = {30, 60, 90} void statusOnOff() void setVolumeControl() void setSleepFunction() implements

TV public TV() public TV(boolean status,int volume,int sleepTime)

implements

public void statusOnOff() public void setVolumeControl() public void setSleepFunction()

DVD public DVD() public DVD(boolean status,int volume,int sleepTime) public void statusOnOff() public void setVolumeControl() public void setSleepFunction()

จากโปรแกรมขางตนเปนการสรางอินเตอรเฟสของรีโมทคอนโทรล ซึ่งมีชื่อในการทํางานรวมกัน แต ลักษณะการทํางานของตัวรีโมทคอนโทรลจะแตกตางกันไป อยางเชนสถานะ เปดปด, การปรับเสียง หรือการตั้ง เวลาปดเปนตน ทําการสรางคลาส TV และ DVD ขึ้นมาทําการ implements อินเตอรเฟส RemoteControl ดังนั้นในคลาสของ TV และ DVD จะตองประกอบดวยทุกๆเมธอดที่อยูในอินเตอรเฟส RemoteControl และ จะตองประกาศเปน public เมธอดดวย ขอสังเกตอีกอยางคือ อินเตอรเฟส RemoteControl มีตัวแปรชนิดอะเรยชื่อ sleepTime เปนชนิด int ตั ว แปรนี้ จ ะสามารถเรี ย กใช ไ ด โ ดยอา งชื่ อ อิ น เตอร เ ฟส และตั ว แปรนี้ เ ป น ค า คงที่ ไ ม ส ามารถเปลี่ ย นแปลงได เนื่องจากตัวแปรในอินเตอรเฟสจะเปน static และ final โดยอัตโนมัติ ดังนั้นเมื่อประกาศตัวเปนในอินเตอรเฟส ตองกําหนดคาเริ่มตนดวย

[email protected]

8/25

Abstract & Interface

Modern Programming Languages

สรางโปรแกรม UseInterfaces.java เพื่อเรียกใชงานคลาส TV และ DVD

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

พิจารณาจากโปรแกรม UseInterfaces.java o บรรทัดที่ 64 : สรางออบเจกตอะเรยชื่อ remote เปนชนิด RemoteControl อยาลืมวา อินเตอรเฟสไมสามารถสรางออบเจกตได แตสามารถเปนตัวแปรอางอิงได o บรรทัดที่ 65 ทําการสรางออบเจกต remote[0] ซึ่งเปนชนิด RemoteControl แตเปนออบ เจกตของ TV o บรรทัดที่ 66 ทําการสรางออบเจกต remote[1] ซึ่งเปนชนิด RemoteControl แตเปนออบ เจกตของ DVD และมีการเรียกใชงานคอนสตรัคเตอรโดยกําหนดคาเริ่มตนดวย สังเกต RemoteControl.SleepTime สามารถเรียกใชงานไดเลย เนื่องจากเปนตัวแปร static o บรรทัดที่ 67 ทําการสรางออบเจกต remote[2] ซึ่งเปนชนิด RemoteControl แตเปนออบ เจกตของ TV และมีการเรียกใชงานคอนสตรัคเตอรโดยกําหนดคาเริ่มตนดวย o บรรทัดที่ 68 ทําการเรียกใชงานเมธอด showAll(remote) โดยมีการกําหนดพารามิเตอรที่ รับเขามาเปนออบเจกตอะเรยชนิด RemoteControl และในเมธอด shawAll() นี้จะไปเรียก

[email protected]

9/25

Abstract & Interface

Modern Programming Languages

เมธอด show(r[i]) ที่อยูในบรรทัดที่ 52 โดยรับคาพารามิเตอรเขาเปนออบเจกตที่มีตัวแปร อ า งอิ ง ชนิ ด RomoteControl เพื่ อ ทํ า การวนรอบในการแสดงผลการทํ า งานของ RemoteControl จากตั ว อย า งการเรี ย กใช เ มธอดนี้ พ ยายามมองให เ ห็ น ข อ ดี ข องการ upcasting ใหได คือสามารถสรางออบเจกตไดหลายชนิดโดยสงผานคาตัวแปร หรือสงคากลับ ไดดวยตัวแปรชนิดเดียว 6.3 Multiple Inheritance Father

Parent extends

Mother

extends

Child

Child

Single Inheritance

Multiple Inheritance

o

Single Inheritance คือการที่คลาสลูกสืบทอดคุณสมบัติจากคลาสแม เพียง 1 คลาส

o

Multiple Inheritance คือการที่คลาสลูกสืบทอดคุณสมบัติจากคลาสแมมากกวา 1 คลาส

o

ในภาษาจาวาอาศัยการใชอินเตอรเฟส เขามาใชในการสืบทอดคุณสมบัติจากคลาสแมไดมากกวาหนึ่ง คลาส เนื่องจาก อินเตอรเฟสไมมีการกําหนดรายละเอียดการทํางาน จากการสืบทอดในลักษณะเชนนี้ในภาษา C++ สามารถเขียนโปรแกรมในลักษณะนี้ได แตจะมีความ ยุงยาก สําหรับในภาษาจาวา ไมอนุญาตใหทําการ Multiple Inheritance ดวยการใชคียเวิรด extends

o o

GrandParent String bloodGroup extends

Father

Mother

public Father(String bloodGr)

public Maothe(String bloodGr)

void showGroup()

void showGroup() extends

Child public Child(String bloodGr)

[email protected]

10/25

Abstract & Interface

o o o

Modern Programming Languages

จากไดอะแกรมขางตน สังเกตวาเมื่อสรางออบเจกต เชน Child c = Child(“A”); เมื่อเรียกใช c.showGroup(); จะทําใหเกิดความกํากวมในการเรียกใชงานเมธอดนี้ วาเรียกใชเมธอด ของคลาสใด เมื่อเรียกใช super.bloodGroup จะทําใหเกิดความกํากวมเชนกัน ซึ่งในลักษณะนี้ภาษาจาวาไมยอม

6.3.1 Multiple Inheritance โดยการใช interface o

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

โดยที่ คียเวิรด extends ตองอยูกอน implements เสมอ ActionCharacter public ActionCharacter(String n) public void fly() String name implements

extends implements interface Flying

interface Fighting

void fly()

void fight() SuperHero implements

public SuperHero()

implements

pulic void fight()

จากคลาสไดอะแกรมขางบน สรางคลาส SuperHero สืบทอดคุณสมบัติคลาส ActionCharacter และ implements interface Fighting และ Flying จากรูปเห็นไดวาคลาส SuperHero ไมตองสรางเมธอด public void fly() เนื่องจากคลาส ActionCharacter ที่ทําการสืบทอดนั้น ประกอบดวย public void fly() นอกจากวา คลาส SuperHero ตองการเปลี่ยนแปลงการทํางานของคลาส ActionCharacter ซึ่งจะเปนไปตามแนวคิดของ เมธอดแบบ Overriding คือ คลาสลูกสามารถเปลี่ยนแปลงการทํางานในคลาสแมได

[email protected]

11/25

Abstract & Interface

Modern Programming Languages

ในคอมเมนตบรรทัดที่ 26-29 ถาเอาคอมเมนตออกคอมไพลผานหรือไม และถาหากคอมไพลผานแลวผล ที่ไดจากการรันจะเปนเชนไร

[email protected]

12/25

Abstract & Interface

Modern Programming Languages

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

6.3.2 Extending Interface with Inheritance

ภาษาจาวาอนุญาตใหใช Multiple interface Inheritance แทน ทั้งนี้เนื่องจากในเมธอดไมมีการระบุการ ทํางานภายในเมธอด ดังนั้นการสืบทอดคุณสมบัติของอินเตอรเฟส จึงไมมีผลตอการทํางาน o อินเตอรเฟสสามารถสืบทอดคุณสมบัติของอินเตอรเฟส ไดโดยการใชคียเวิรด extends o อินเตอรเฟสที่ทําการสืบทอดคุณสมบัติ จะไดคุณลักษณะและเมธอดของอินเตอรเฟสนั้นมาดวย o Multiple Inheritance สามารถกระทําไดทางออม โดยการสืบทอดคุณสมบัติของอินเตอรเฟส interface Microsoft extends

void getVersion() interface Internet

interface DevelopTools extends

void whatTool()

void getBrowser() extends

implements

interface Windows void performance() implements

Programmer public void getVersion() public void whatTool()

User public void getVersion() public void getBrowser() public void performance()

จากคลาสไดอะแกรมขางตนเขียนโปรแกรมไดดังนี้

[email protected]

13/25

Abstract & Interface

Modern Programming Languages

พิจารณาการสรางคลาส Programmer ทําการ implements อินเตอรเฟส DevelopTools o อิ น เตอร เ ฟส DevelopTools สืบทอดคุณสมบัติของอินเตอรเฟส Microsoft ดังนั้นในคลาส Programmer จะตองประกอบดวยเมธอดที่อยูในทั้งสองอินเตอรเฟส และตองประกาศเปน public โดย จะตองสรางเมธอดดังนี้  public void getVersion() { }  public void whatTool() { }

พิจารณาการสรางคลาส User ทําการ implements อินเตอรเฟส DevelopTools o อินเตอรเฟส Windows สืบทอดคุณสมบัติของอินเตอรเฟส Microsoft และ Internnet ดังนั้นในคลาส User จะตองประกอบดวยเมธอดที่อยูในทั้งสองอินเตอรเฟส และตองประกาศเปน public โดยจะตอง สรางเมธอดดังนี้  public void getVersion() { }  public void getBrowser() { }  public void performance() { }

[email protected]

14/25

Abstract & Interface

Modern Programming Languages

สรางโปรแกรม ExtendsInterfaces.java เพื่อเรียกใชงานคลาส Programmer และ User

พิจารณาจากโปรแกรม ExtendsInterfaces.java o บรรทัดที่ 37 มีการคอมเมนตนั้น คอมไพลไมผานเนื่องจากอินเตอรเฟส Microsoft ไมมีเมธอด getVersion()

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

6.3.3 Name Collision o o o

เมื่อ implements อินเตอรเฟสมากกวาหนึ่งอินเตอรเฟส และอินเตอรเฟสนั้นมีชื่อเมธอดเหมือนกัน สามารถเกิด Name Collision ได เมื่อเกิด Name Collision เมธอดตองมีการคืนคาเหมือนกัน (return type) คือเปนเมธอดแบบ Overloading มิฉะนั้น Compile error ควรหลีกเลี่ยงการเกิด Name Collision เพราะจะทําใหเกิดความสับสน

[email protected]

15/25

Abstract & Interface

Modern Programming Languages

ยกตัวอยางโปรแกรม โดยการสราง NameCollision.java ดังนี้

[email protected]

16/25

Abstract & Interface

Modern Programming Languages

interface MyInterface1

interface MyInterface4 extends

void myMethod() extends

implements

interface MyInterface3 MyClass2

int myMethod()

void myMethod() int myMethod(int x) implements

interface MyInterface2 int myMethod(int x)

MyClass3 int myMethod(int x) extends

MyClass1 int myMethod()

MyClass4 MyClass5

พิจารณาจากโปรแกรม NameCollision.java o บรรทัดที่ 13 มีการคอมเมนตอินเตอรเฟส MyInterface4 เนื่องจากเกิด Name Collision เนื่องจากเมธอดไมมีการรับพารามิเตอรเขาเหมือนกัน แตมีการสงคากลับแตกตางกัน ทําให คอมไพลไมผาน เพราะวาถาเรียกใช จะไมรูวา ใชเมธอดของอินเตอรเฟสใด o บรรทัดที่ 40 มีการคอมเมนตคลาส MyClass5 เนื่องจากเกิด Name Collision เชนกัน o บรรทัดที่ 35 คลาส MyClass4 ไมสรางเมธอด int myMethod() ได เนื่องจากสืบทอด คุณสมบัติจากคลาส MyClass1 แลว

[email protected]

17/25

Abstract & Interface

Modern Programming Languages

แบบฝกหัด 1. สรางโปรแกรม AbstractClass.java ยังคอมไพลไมผาน แกไขใหถูกตองแลวดูผลที่ได abstract class Shape { String name; abstract double area(); String getName(){ return name; } public String toString() { return getName()+" area : "+area(); } } class Circle extends Shape { double radius; Circle(double r) { name = "Ciecle"; radius = r; } double area() { return Math.PI*radius*radius; } } class Rectangle extends Shape { double width, height; Rectangle(double w,double h) { name = "Rectangle"; width = w; height= h; } double area() { return width*height; } } public class AbstractClass { public static void main(String[] args) { Shape s = new Shape(); Shape c = new Circle(2); Shape r = new Rectangle(2,2); System.out.println(c); System.out.println(r); } } ผลที่ได เมื่อทําใหคอมไพลผาน:

_______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________

เพราะเหตุใดจึงคอมไพลไมผาน _______________________________________________________ _______________________________________________________

[email protected]

18/25

Abstract & Interface

Modern Programming Languages

จากโปรแกรม AbstractClass.java ลองสรางเมธอด public Shape createShape()

เพื่อใชในการสรางรูปทรงที่ตองการ ทําการวนรอบรับเมนู โดยกดเมนู 1 สรางสี่เหลี่ยม กดเมนู 2 สรางวงกลม นอกนั้นออกจากโปรแกรม 2. สรางโปรแกรม UseInterfaces.java ยังคอมไพลไมผาน แกไขใหถูกตองแลวดูผลที่ได interface RemoteControl { int[] SLEEP_TIME = {30,60,90}; void statusOnOff(); void setVolumeControl(); void setSleepFunction(); } class TV implements RemoteControl { boolean status; int volume, sleepTime; TV() { } TV(boolean status,int volume,int sleepTime) { this.status = status; this.volume = volume; this.sleepTime = sleepTime; } void statusOnOff(){ if (status == true) System.out.println("TV : ON"); else System.out.println("TV : OFF"); } public void setVolumeControl(){ System.out.println("Volume : "+volume); } public void setSleepFunction(){ System.out.println("Sleep Time : "+sleepTime); } } class DVD implements RemoteControl{ boolean status; int volume; int sleepTime; DVD () { } DVD (boolean status,int volume,int sleepTime) { this.status = status this.volume = volume; this.sleepTime = sleepTime; } public void statusOnOff(){ if (status == true) System.out.println("DVD : ON"); else System.out.println("DVD : OFF"); } public void setVolumeControl(){ System.out.println("Volume : "+volume); } }

[email protected]

19/25

Abstract & Interface

Modern Programming Languages

public class UseInterfaces{ static void show(RemoteControl r){ r.statusOnOff(); r.setVolumeControl(); r.setSleepFunction(); System.out.println("********************"); } static void showAll(RemoteControl[] r){ for (int i=0;i
_______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________

เพราะเหตุใดจึงคอมไพลไมผาน _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ 3. สรางโปรแกรม MultiInherit.java ยังคอมไพลไมผาน แกไขใหถูกตองแลวดูผลที่ได class ActionCharacter { String name; ActionCharacter(String n) { name = n; } public void fly() { System.out.println("Call method fly() in ActionCharacter"); System.out.println(name+" fly."); } }

[email protected]

20/25

Abstract & Interface

Modern Programming Languages

interface Fighting { void fight(); } interface Flying { void fly(); } class SuperHero extends ActionCharacter implements Fighting, Flying { public void fight() { System.out.println("Call method fight () in SuperHero"); System.out.println(name+" fight."); } //เมื่อนําคอมเมนตออก ผลที่ไดเปนอยางไร /* public void fly() { System.out.println("Call method fly() in SuperHero"); System.out.println(name+" fly."); } */ } public class MultiInherit { static void doFighting(Fighting f) { f.fight(); } static void doFlying(Flying f) { f.fly(); } static void doAct(ActionCharacter a) { a.fly(); } public static void main(String[] args) { SuperHero hero = new SuperHero("Superman"); doFighting(hero); doFlying(hero); doAct(hero); } } ผลที่ได :

_______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________

เพราะเหตุใดจึงคอมไพลไมผาน _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________

[email protected]

21/25

Abstract & Interface

Modern Programming Languages

เมื่อคอมไพลผานแลว นําคอมเมนตออก ผลที่ไดเปนอยางไร _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ 4. สรางโปรแกรม ExtendsInterface.java ยังคอมไพลไมผาน แกไขใหถูกตองแลวดูผลที่ได interface Microsoft { void getVersion(); } interface Internet { void getBrowser(); } interface DevelopTools extends Microsoft { void whatTool(); } interface Windows extends Microsoft, Internet { void performance(); } class Programmer implements DevelopTools { public void getVersion(){ System.out.println("Version 6"); } } class User implements Windows { public void getVersion(){ System.out.println("Windows XP"); } public void getBrowser(){ System.out.println("IE 6.0"); } } public class ExtendsInterface { static void showMicrosoft(Microsoft m){ m.getVersion(); m.whatTool(); } static void showDevelopTools(DevelopTools d){ d.getVersion(); d.whatTool(); } static void showWindows(Windows w){ w.getVersion(); w.getBrowser();w.performance(); } public static void main(String[] args) { Programmer p = new Programmer(); User u = new User(); showMicrosoft(p); showDevelopTools(p); System.out.println("-----------"); showWindows(u); } }

[email protected]

22/25

Abstract & Interface

Modern Programming Languages

ผลที่ได : _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________

เพราะเหตุใดจึงคอมไพลไมผาน _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________

สรางโปรแกรม NameCollision.java ยังคอมไพลไมผาน แกไขใหถูกตองเพื่อทําความเขาใจเกี่ยวกับ Name Collision ,การสืบทอดของ interface และการ implements interface

5.

interface MyInterface1{ void myMethod(); } interface MyInterface2{ int myMethod(int x); } interface MyInterface3{ int myMethod(); } interface MyInterface4 extends MyInterface1, MyInterface3{ } class MyClass1 { public int myMethod() { } } class MyClass2 implements MyInterface1,MyInterface2{ void myMethod() { } public int myMethod(int x) { return 2; } } class MyClass3 extends MyClass1 implements MyInterface2{ public int myMethod(int x) { return 3; } } class MyClass4 extends MyClass1 implements MyInterface3{ } class MyClass5 extends MyClass1 implements MyInterface1{ }

[email protected]

23/25

Abstract & Interface

Modern Programming Languages

เพราะเหตุใดจึงคอมไพลไมผาน _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ _______________________________________________________ 6. กําหนด interface MyWord ให interface MyWord { String[] MY_WORD = {"It's could only be Heineken", "Hello,I have to go to somewhere",

"Someday, I will find my way", "Life is not beautiful"}; void getWord(); }

ทําการสราง class SearchChar ดังนี้ public class SearchChar implements MyWord {

public static void main(String[] args) {

} }

จากนั้นทําการคนหาตัวอักษร ‘e’ (ตองใชเมธอด indexOf เทานั้น)ในแตละประโยคใน String array MY_WORD ที่อยูใน interface MyWord โดยแสดงผลลัพธดังนี้ 1. แสดงประโยคที่ทําการคนหาอักษร ‘e’ 2. แสดงตําแหนงที่หาอักษร ‘e’ พบ 3. แสดงจํานวนอักษร ‘e’ ทั้งหมดที่ทําการคนหาเจอ

[email protected]

24/25

Abstract & Interface

[email protected]

Modern Programming Languages

25/25

Related Documents

Chap06
November 2019 4
Solutions Chap06
November 2019 1
Ufa#ed2#sol#chap06
November 2019 5