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