The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ปิติ เกตุ, 2021-04-04 04:44:55

Java OOP Programming

Java OOP Programming

245

X value from Super Class:500

การปกป้ องและการห่อหุ้ม (Protection and Encapsulation)

ตามท่ีไดอ้ ธิบายการใชง้ าน setter และ getter ซ่ึงประกาศตวั แปรเป็ น private ในส่วนของ
แอตทริ บิวต์ในบทที่ 5 แล้วน้ัน แนวคิดของการปกป้ อง (Protection) และการห่อหุ้ม
(Encapsulation) เพ่อื ใหผ้ ทู้ ี่ไม่มีสิทธ์ิเขา้ ไปใชส้ ามารถเขา้ ถึงไดโ้ ดยตรงและเป็ นการป้ องกนั ค่าต่างๆ
ท่ีอาจเกิดการเปลี่ยนแปลงได้ อาจจะเกิดขอ้ ผดิ พลาดอนั ไม่พงึ ประสงคข์ ้ึนได้

พนิดา พานิชกุล (2554, หนา้ 232) กล่าววา่ การห่อหุม้ เป็ นการห่อหุ้มแอตทริบิวตแ์ ละเมธ
อดไดภ้ ายในวตั ถุซ่ึงก็คือการห่อหุม้ ขอ้ มูลและการดาเนินการไวภ้ ายใน การประกาศใชข้ อ้ มูลของแต่
ละคลาสจึงจาเป็ นตอ้ งระบุ “ระดบั การมองเห็น” (Visibility) ให้กบั แอตทริบิวต์และเมธอดด้วย
ส่วนใหญแ่ อตทริบิวตจ์ ะระบุคียเ์ วริ ์ดเป็น private ส่วนเมธอดจะถูกระบุเป็น public

ส่วนกิติพงษ์ กลมกล่อม (2552, หนา้ 24) กล่าววา่ การห่อหุ้มคือกระบวนการในการซ่อน
รายละเอียดของคุณลกั ษณะต่างๆ และรายละเอียดของการทางานของคลาสไวภ้ ายในกล่องหรือ
แคปซูลโดยในภายในจะมีสิ่งต่างๆ ภายนอกคลาสจะติดต่อกบั คลาสไดต้ อ้ งติดต่อผ่านช่องทางที่
คลาสเตรียมไวใ้ หเ้ ทา่ น้นั ช่องทางน้ีคือ public interface

จากท่ีกล่าวมา สรุปไดว้ ่า การห่อหุ้ม หมายถึง การสร้างส่วนการปกป้ องแอตทริบิวตแ์ ละ
เมธอดให้มีระดบั การมองเห็น (Visibility) ท่ีแตกต่างกนั ซ่ึงมุ่งเนน้ ให้ภายในคลาสเขา้ ใชง้ านและ
จดั การไดท้ ้งั หมด แต่หากจากภายนอกคลาสจะสามารถเขา้ ถึงไดต้ ามที่คลาสไดจ้ ดั เตรียมส่วนการ
สื่อสารโดยใชค้ ียเ์ วริ ์ด public เท่าน้นั

การรับทอดคุณสมบตั ิที่ไดก้ ล่าวไปแลว้ ในบทน้ี พบวา่ เมื่อคลายยอ่ ยรับทอดคุณสมบตั ิมา
จากคลาสแม่สามารถเขา้ ถึงแอตทริบิวตข์ องคลาสแม่ท่ีรับทอดมาไดด้ ว้ ย super. ตามดว้ ยแอตทริ
บิวต์ หรือเขา้ ถึงเมธอดดว้ ย super. ตามดว้ ยเมธอด ได้ และจากความรู้เดิมท่ีกล่าวถึง คียเ์ วิร์ด public
private protected น้นั ใชส้ าหรับห่อหุ้มและปกป้ องขอ้ มูลอนั ไดแ้ ก่แอตทริบิวต์ เมธอด หรือการ
กาหนดค่าให้กบั คลาสที่เขา้ ถึง ซ่ึงคุณลกั ษณะของแต่ละคียเ์ วริ ์ดน้นั จะมีคุณลกั ษณะแตกต่างกนั ซ่ึง
อาจกล่าวในมุมของการเขา้ ถึงแอตทริบิวเตอร์และเมธอดได้ในสองลกั ษณะคือ การรับทอดของ
คลาสยอ่ ย การสร้างวตั ถุแลว้ เรียกใชแ้ อตทริบิวตแ์ ละเมธอด

• public
สามารถเขา้ ถึงไดท้ ้งั คลาสที่รับทอดไปและเม่ือนาไปสร้างเป็นวตั ถุแลว้ ใหพ้ จิ ารณาดงั น้ี

246

จากตวั อยา่ งท่ี 7.10 เมื่อตวั แปร x เป็ น public จะพบวา่ คลาสที่รับทอดไปสามารถมองเห็น
และเขา้ ถึงได้ และเมื่อสร้างเป็นวตั ถุแลว้ กส็ ามารถเขา้ ถึงไดเ้ ช่นกนั
public class App {

public static void main(String args[]){
mySubClass obj = new mySubClass();
obj.showData();
System.out.println(“X from super class shown by object class:”+obj.x);

}
}
ส่ิงท่ีเขา้ ถึงได้

ภาพท่ี 7.15 แสดงการเขา้ ถึงตวั แปรและเมธอดของคลาสเม่ือมีการรับทอดโดยปกติ
----------------------------------------------------------------------------------------------------------------------
public class mySubClass extends mySuperClass{

public void showData(){
System.out.println("X of Super Class shown by SubClass:"+x);
//ตัวแปร x ท่ีคลาสรับทอดเข้าถึงได้โดยตรง
showX(); //เมธอดของ super class ที่คลาสท่ีรับทอดเข้าถึงได้โดยตรง

}
}
ส่ิงที่เขา้ ถึงได้

247

ภาพท่ี 7.16 แสดงตวั แปรและเมธอดที่เขา้ ถึงไดเ้ ม่ือมีการรับทอดและเขา้ ถึงดว้ ย this
----------------------------------------------------------------------------------------------------------------------
public class mySuperClass {

public int x=500;
public void showName(){

System.out.println("My name is mySuperClass");
}
public void showX(){

System.out.println("X from Super Class:"+x);
}
}
สิ่งท่ีเขา้ ถึงได้

248

ภาพท่ี 7.17 แสดงตวั แปรและเมธอดที่จาก Superclass
----------------------------------------------------------------------------------------------------------------------
ผลการรัน
X of Super Class shown by SubClass:500
X from Super Class:500
X from super class shown by object class:500

คาอธิบาย จากตวั อยา่ งน้ีพบวา่ หากมีการกาหนดค่า x ให้เปล่ียนไป ไม่วา่ จะเป็ นคลาสท่ีรับทอดมา
หรือคลาสโปรแกรมหลักท่ีนามาสร้างเป็ นวตั ถุแล้วใช้งานก็ตามจะทาให้ค่าของ x มีการ
เปล่ียนแปลงไปได้ ดงั น้นั จาเป็ นอยา่ งยง่ิ ตอ้ งปกป้ องและเขา้ ใชง้ านผา่ นเมธอด set get เป็ นไปตาม
แนวทางการใชง้ านของการเขียนโปรแกรมเชิงวตั ถุ

• private

จากตวั อยา่ ง public ที่ผ่านมาถา้ เปล่ียนคียเ์ วริ ์ดเป็ น private จะทาให้ภายในคลาสเดียวกนั
เท่าน้นั ท่ีเขา้ ใชง้ านแอตทริบิวตห์ รือเมธอดท่ีนาหนา้ ดว้ ย private ไดน้ น่ั แสดงถึงการใชท้ ่ีเป็ นส่วนตวั
ภายในคลาสตวั เองเทา่ น้นั คลาสที่รับทอดและ เม่ือนาไปสร้างเป็นวตั ถุแลว้ ไมส่ ามารถเขา้ ถึง แอ
ตทริบิวเตอร์และเมธอดที่นาหนา้ ดว้ ย private ได้
public class mySuperClass {

private int x=500;
private void showName(){

System.out.println("My name is mySuperClass");

249

}
public void showX(){

System.out.println("X from Super Class:"+x);
showName();
}
}
สิ่งที่เขา้ ถึงได้

ภาพที่ 7.18 แสดงแอตทริบิวตแ์ ละเมธอดที่เขา้ ถึงไดเ้ ม่ือกาหนด private

คาอธิบาย จากภาพพบวา่ สามารถมองเห็นตวั แปรและเมธอดท่ีมีในคลาสไดท้ ้งั หมด

คลาสทร่ี ับทอดมา
public class mySubClass extends mySuperClass{

public void showData(){
showX();

}
}
คาอธิบาย คลาสท่ีรับทอดมาสามารถเขา้ ถึงไดเ้ ฉพาะท่ีเป็ น public เท่าน้ัน ไม่สามารถเขา้
ดาเนินการกบั ส่วนที่เป็ น private เช่น ตวั แปร x หรือ เมธอด showName() ไดเ้ ลย แสดงการ
มองเห็นดงั ภาพ

250

ภาพท่ี 7.19 แสดงแอตทริบิวตแ์ ละเมธอดมีการรับทอด
คาอธิบาย จากภาพด้านบนพบว่ามองเห็นเฉพาะ showX() เท่าน้ันไม่สามารถมองเห็น
เพือ่ ที่จะเขา้ ถึงตวั แปร x หรือ showName() ของคลาสแม่ไดเ้ ลย
เมื่อสร้างเป็ นวัตถุแล้ว

ภาพท่ี 7.20 แสดงแอตทริบิวตแ์ ละเมธอดมีการรับทอดและสร้างวตั ถุ
คาอธิบาย เม่ือมีการสร้างวตั ถุจะพบว่าวตั ถุสามารถเข้าถึงได้เฉพาะเมธอดที่เป็ น public
เทา่ น้นั ไมส่ ามารถท่ีจะมองเห็น showName() และ x ไดเ้ ลย

• protected

การเขา้ ถึงของคลาสท่ีเกี่ยวขอ้ งน้นั จะพบวา่ ทุกคลาสสามารถเขา้ ถึงได้ โดยเฉพาะภายใน
ตาแหน่งที่กาหนดเท่าน้นั ท้งั ส่วนเฉพาะเมธอดหรือแพคเกจ แตห่ ากเป็ นต่างแพคเกจกนั จะไม่
สามารถเขา้ ถึงได้ หรือตา่ งเมธอดก็จะไม่สามารเขา้ ถึงได้ ใหส้ ังเกตจากตวั อยา่ งต่อไปน้ี
public class mySuperClass {
protected int x=500;

251

protected void showName(){
System.out.println("My name is mySuperClass");

}
public void showX(){

System.out.println("X from Super Class:"+x);
showName();
}
}
สิ่งท่ีสามารถเขา้ ถึงได้

ภาพที่ 7.21 แสดงส่ิงที่เขา้ ถึงไดเ้ ม่ือกาหนดเป็ น protected
คลาสที่รับทอด
public class mySubClass extends mySuperClass{

public void showData(){
this.x=800;
showName();
showX();

}
}
คาอธิบาย คลาสท่ีรับทอดสามารถเขา้ ถึงแอตทริบิวตแ์ ละเมธอดได้

252

ภาพท่ี 7.22 แสดงสิ่งท่ีเขา้ ถึงไดเ้ ม่ือกาหนดเป็ น protected เม่ือรับทอด
คลาสทนี่ าไปสร้างเป็ นวัตถุ
public class App {

public static void main(String args[]){
mySubClass obj = new mySubClass();
obj.showData();
obj.x=800;
obj.showName();

}
}
สิ่งที่เขา้ ถึงได้

ภาพที่ 7.23 แสดงส่ิงท่ีเขา้ ถึงไดเ้ ม่ือกาหนดเป็ น protected เมื่อสร้างวตั ถุ

253

การโอเวอร์ไรด์ (Override)

พนิดา พานิชกุล (2554, 241) กล่าววา่ การโอเวอร์ไรด์ หมายถึง เมธอดหลายๆ เมธอดที่มี
ช่ือเดียวกนั อยใู่ นคลาสเดียวกนั โดยชนิดและอาร์กิวเมนตเ์ หมือนกนั ดว้ ย โอเวอร์ไรดจ์ ะเกิดข้ึนใน
กรณีที่มีความสัมพนั ธ์แบบการสืบทอด ส่วน วาย. แดเนียล เหลียง (2009, p. 309) กล่าวา่ Subclass
ที่สืบทอดเมธอดจาก Superclass บางคร้ัง Subclass จาเป็ นตอ้ งอิมพลีเมนต์เมธอดท่ีถูกรับทอดมา
จาก Superclass นี่คือการถูกอา้ งเช่นเมธอดโอเวอร์ไรด์ นอกจากน้นั เดวดิ อีเทอริดจ์ (2009, p. 53)
กล่าวไวว้ ่า การโอเวอร์ไรด์ เมธอดซ่ึงรับทอดพฤติกรรมที่สามารถปรับปรุงแกไ้ ขใหเ้ หมาะสมกบั
คุณลักษณะทางตรรกะของ Subclass โดยท่ีรับทอดคุณสมบัติทางตรรกะพ้ืนฐานทวั่ ไปของ
Superclass ของมนั มา

ดงั น้นั จึงสรุปไดว้ ่าการเขียนทบั คือ การสร้างเมธอดใหม่ท่ีใช้ช่ือเดิมที่รับทอดมา ซ่ึงโดย
ปกติแล้ว การรับทอดคุณสมบตั ิมาใช้งานไม่จาเป็ นตอ้ งเขียนใหม่ก็สามารถทางานได้ แต่หาก
ตอ้ งการเขียนการทางานของเมธอดน้ันใหม่โดยการผ่านค่าพารามิเตอร์และคืนค่ากลบั แบบเดิม
สามารถทางานไดซ้ ่ึงแสดงตวั อยา่ งดงั น้ี

Superclass ดงั น้ี
public class CalTaxOveride{

private Tax=0;
public void taxCal(double x){

Tax=x*0.07;
}
public double showTax(){

return Tax;
}
}
จากคลาสดงั กล่าวน้ีอธิบายไดว้ า่ การใชง้ านคลาสน้ีจะตอ้ งคิดภาษี 7% เสมอไป ดงั น้นั หาก
มีการรับทอดคลาสน้ีไปใช้งานการคานวณภาษีเหมือนเดิมแมอ้ ตั ราภาษีจะเปลี่ยนไปก็ตาม งาน
ลกั ษณะดงั กล่าวน้ีอาจจะใหค้ ุณสมบตั ิของการโอเวอร์ไรเขา้ มาช่วยโดยไม่ตอ้ งเปล่ียนแปลงเฉพาะ
เมธอด taxCal ไดโ้ ดยเขียนการรับทอดดงั น้ี
public class subCalTax extends CalTaxOverride {
public void taxCal(double x){

Tax=x*0.09;

254

}
}
คลาสท่ีนาเอาคลาสยอ่ ยน้ีไปสร้างเป็นวตั ถุสามารถเรียกใชง้ านการคานวณใหมไ่ ด้
ตวั อย่างท่ี 7.13 จงออกแบบคลาสการคานวณภาษีโดยกาหนดใหม้ ีสองเมธอดคือ การคานวณ คิดใน
อตั รา 0.07 และ สร้างคลาสยอ่ ยสาหรับการคานวณในอตั ราใหม่ 0.09 แลว้ เขียนโปรแกรมส่วนการ
รันเพ่ือรันทดสอบภาษี
คลาสไดอะแกรม

ภาพที่ 7.22 คลาสไดอะแกรมของตวั อยา่ งที่ 7.13
ขอ้ สังเกตคือเม่ือมีการรับทอดแลว้ ยงั ระบุส่วนเมธอดที่จะทาการโอเวอร์ไรดด์ ว้ ย
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public class CalTax {

private double Tax=0;
public void calTax(double x){

setTax(x * 0.07);
}
public void showTax(double t){

255

System.out.println("Tax="+getTax());
}
public double getTax() {

return Tax;
}
public void setTax(double Tax) {

this.Tax = Tax;
}
}
----------------------------------------------------------------------------------------------------------------------
public class subCalTax extends CalTax{
public void calTax(double x) {

super.setTax(x*0.09);
}
public void showTax(double t) {

super.showTax(t);
System.out.println("-----------");
System.out.println("ส่วนการแสดงขอ้ มูลเพ่ิมเติม");
}
}
----------------------------------------------------------------------------------------------------------------------
public class mainApp {
public static void main(String args[]){
subCalTax obj=new subCalTax();
obj.calTax(1000);
obj.showTax(obj.getTax());
}
}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี

256

Tax=90.0
-----------
ส่วนการแสดงขอ้ มลู เพมิ่ เติม

สรุป

การรับทอด คือ การนาเอาความสามารถของคลาสที่ออกแบบเอาไวแ้ ลว้ มาใชง้ าน เพ่ือทา
ให้โปรแกรมส้ันลง และขยายความสามารถของการเขียนโปรแกรม ลดขอ้ ผิดพลาด การรับทอด
สามารถรับทอดได้ท้งั ส่วนแอตทริบิวต์และเมธอด คลาสที่เป็ นคลาสหลกั ให้คลาสอื่นรับทอด
เรียกวา่ คลาสแม่ (Super class) และคลาสที่รับทอดคลาสอ่ืนเรียกวา่ คลาสยอ่ ย (Subclass) โดยใช้
งานผ่านคียเ์ วิร์ด extends ในคลาสย่อย การเรียกใชง้ านเมธอดของคลาสย่อยอาจเรียกใช้งานคลาส
หลกั โดย เรียกใชโ้ ดย super. ตามดว้ ยชื่อเมธอด หรือตวั ท่ีตอ้ งการเขา้ ถึง การเขียนทบั เมธอดของ
คลาสหลกั ในคลาสย่อยท่ีรับทอดมาใหม่เรียกว่าการโอเวอร์ไรด์ ซ่ึงทาให้เมธอดที่ได้มีหน้าที่
แตกต่างไปจากเดิม คุณสมบตั ิที่สาคญั อีกประการคือการปกป้ องขอ้ มูล ดว้ ยการกาหนด public
private protected เพ่อื ใหก้ ารรับทอดคลาสไปใชง้ านน้นั สามารถทาไดใ้ นระดบั ท่ีแตกต่างกนั ถา้ เป็ น
public สามารถจดั การตวั แปรไดท้ ้งั หมด private ส่วนของการเขา้ ถึงไดใ้ นส่วนคลาสท่ีรับทอดไป
เทา่ น้นั ส่วน protected สามารถเขา้ ถึงไดเ้ ฉพาะในส่วนท่ีกาหนดไวเ้ ทา่ น้นั

257

แบบฝึ กหดั ท้ายบท

1. จงบอกความหมายของการรับทอดมาพอเขา้ ใจ
2. กาหนดคลาสแมลง จงเขียนโครงโปรแกรมคลาสแมงดานา โดยรับทอดจากแมลง
3. กาหนดใหม้ ีคลาส A เป็นคลาสแม่ คลาส B เป็นคลาสที่รับทอดมา และคลาส C เป็ นคลาสที่
เรียกใชง้ าน จงเขียนคลาสไดอะแกรมและโครงโปรแกรม
4. จงเขียนโปรแกรมสาหรับการส่ังอาหารจานเดียว โดยกาหนดใหใ้ ชง้ านการรับทอดคลาส
5. จงบอกความหมายของการปกป้ องตวั แปร มาพอเขา้ ใจ
6. จงอธิบายความหมายของคียเ์ วริ ์ด public และ private มาพอเขา้ ใจ
7. จงเขียนโปรแกรมสร้างคลาส ตามแนวทางดงั น้ี AB, C เรียกใชง้ าน B หลงั จากน้นั ใน A
กาหนดเมธอดให้มีเมธอดการแสดงตวั อกั ษรภาษาองั กฤษจาก A-Z โดยกาหนดให้เป็ น private
หลงั จากน้นั เขียนเมธอด show เพอ่ื แสดง โดยไมใ่ ห้ C เขา้ ถึง เมธอดการแสดงตวั อกั ษรไดโ้ ดยตรง
8. การใชง้ าน super ใชไ้ ดอ้ ยา่ งไรบา้ ง จงอธิบายและยกตวั อยา่ ง
9. การใชค้ ียเ์ วอร์ด this มีหลกั การใชง้ านอยา่ งไร จงอธิบาย
10.จงเขียนโปรแกรมเก็บประวตั ิของคนโดยให้สามารถ บนั ทึก แกไ้ ข แสดงรายละเอียด โดย
เก็บขอ้ มลู ลงในโครงสร้างขอ้ มูลแบบอาร์เรยห์ รือเวกเตอร์กไ็ ด้
11.จากวตั ถุต่อไปน้ี จงอธิบายวา่ อะไรรับทอดคุณสมบตั ิมาจากอะไร มดง่าม ปลาบู่ ช้าง ไก่
แมลง สัตวน์ ้า สัตวส์ ่ีขา สตั วป์ ี ก
12.จงอธิบายความหมายของการเขียนทบั พร้อมกบั ยกตวั อยา่ ง
13.หากมีเมธอดคานวณภาษีที่ตอ้ งการเปลี่ยนแปลงรายละเอียดเมื่อมีพนกั งานเงินเดือนข้ึนและ
ไดร้ ับโบนสั จะตอ้ งใชห้ ลกั การใดมาเขียนเมธอดใหท้ างานไดเ้ ช่นเดิม
14.จงเขียนโปรแกรมใหม้ ีการรับทอดกนั อยา่ งนอ้ ยสี่ทอด
15.จงเขียนโปรแกรมประยุกตส์ าหรับการใชง้ าน super, this, public, private, protected และ
override ใหอ้ ยใู่ นโปรแกรมเดียวกนั

258

เอกสารอ้างอิง

กิตติ ภกั ดีวฒั นะกุล และ ศิริวรรณ อมั พรดนยั . (2544). Oject-Oriented ฉบับพนื้ ฐาน. กรุงเทพฯ:
KTP Comp&Consult.

กิตติพงษ์ กลมกล่อม. (2552). การวเิ คราะห์และออกแบบระบบเชิงวัตถุด้วย UML. กรุเทพฯ: เคทีพี
แอนด์ คอนซลั ท.์

ธีรวฒั น์ ประกอบผล. (2552). คู่มือการเขยี นโปรแกรมภาษา Java. กรุงเทพฯ: ซคั เซส มีเดีย.
_________. (2553). คู่มอื การเขียนโปรแกรมภาษา Java. กรุงเทพฯ: ซิมพลิฟลาย.
พนิดา พานิชกุล. (2548). Object-Oriented ฉบบั พนื้ ฐาน. กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
_________. (2554). การเขียนโปรแกรมคอมพิวเตอร์เบื้องต้นด้วยภาษาจาวา. พิมพค์ ร้ังท่ี 5.

กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
สมโภชน์ ช่ืนเอ่ียม. (2553). วทิ ยาการคอมพวิ เตอร์เบือ้ งต้น. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
Brett Spell. (2000). Professional Java Programming. USA: Wrox Press Ltd. Arden House, 1102

Warwick Road, Acocks Green, Birmingham, B27 6BH, UK.
Bruce Eckel. (2000). Thinking in Java. 2nd . USA: Prentice Hall PTR Prentice-Hall.
Cay Horstmann. (2002). Object-Oriented Design & Patterns. USA: John Wiley & Sons.
David Etheridge. (2009). Java:The Fundamentals of Objects and Classes-An Introduction to

Java Programming. Ventus Publishing Aps. [Online]. Available:
http://www.BookBoon.com.
Simol Kendal. (2009). Object Orientted Programming using Java. Ventus Publishing Aps.
[Online]. Available: http://www.BookBoon.com
Wikipedia. (2007). “Object-oriented programming”. [Online] Available:
http://en.wikipedia.org/wiki/Object-oriented_programming.
Y. Daniel Liang. (2007). Introduction to Java Programming. USA: Pearson Prentice Hall
Pearson Education, Inc.
Yacov Fain. (2004). JavaTM Programming for kid, parents and grandparents. [Online].
Available: http://www.BookBoon.com.

บทท่ี 8
อนิ เทอร์เฟสและแอบสแทรกคลาส

เนื่องจากคุณสมบตั ิของการสืบทอดน้นั คลาสย่อย สามารถสืบทอดจากคลาสแม่ไดเ้ พียง
หน่ึงคลาสเท่าน้นั หากตอ้ งการสืบทอดมากกว่าหน่ึงคลาส ภาษาจาวาไม่สนบั สนุนการสืบทอด
มากกว่าหน่ึงคลาส (Multiple Inheritance) อีกท้งั บางคร้ังคลาสบางคลาสยงั ไม่จาเป็ นตอ้ งมี
รายละเอียดภายในเพียงแต่ระบุเมธอดเอาไวใ้ ห้ผูท้ ่ีจะนาไปใชง้ านไดเ้ ขียนโปรแกรมกาหนดการ
ทางานภายในไดเ้ อง ดงั น้นั จากปัญหาและความจาเป็ นดงั กล่าว แนวคิดของอินเทอร์เฟสจึงเกิดข้ึน
สาหรับแนวคิดของแอบสแทรกคลาส (Abstract class) น้นั สร้างข้ึนมาเพื่อแกป้ ัญหาของการท่ียงั ไม่
ต้องการเขียนรายละเอียดการทางานภายในของเมธอด ให้ผูท้ ี่สืบทอดไปใช้งานได้ไป เขียน
โปรแกรมเองคลา้ ยอินเทอร์เฟส แต่กาหนดการใชง้ านตามแนวทางการใชง้ านตามคุณสมบตั ิของ
คลาสแม่ปกติทุกประการ บทน้ีนาเสนอ แนวคิดของการสร้างอินเทอร์เฟส การอิมพลีเมนต์
(Implement) เพ่ือใช้งาน และส่วนสุดทา้ ยของบทจะแสดงการสร้างและการใช้งานแอบสแทรก
คลาส

แนวคดิ ของการสร้างอนิ เทอร์เฟส

แนวคิดของการสร้างอินเทอร์เฟสเกิดจากการท่ีสร้างคลาสแม่แลว้ ให้คลาสยอ่ ยสืบทอดมา
ใชง้ านน้นั ในโปรแกรมภาษาจาวาแลว้ ไม่สามารถสืบทอดมาใชง้ านไดเ้ กินหน่ึงคลาสเท่าน้นั เช่น
หากคลาสแม่เป็ นคลาสเครื่องคิดเลขแบบที่หน่ึง และคลาสเคร่ืองคิดเลขแบบท่ีสอง ที่ออกแบบไว้
ใหม้ ีขีดความสามารถที่แตกตา่ งกนั แต่ผใู้ ชไ้ ม่สามารถสืบทอดคุณสมบตั ิของท้งั สองคลาสมาใชง้ าน
ได้ จะตอ้ งเลือกเพียงคลาสใดคลาสหน่ึงเท่าน้นั

พนิดา พานิชกุล (2548, หนา้ 41) กล่าวว่า Interface คือ การบริการท่ีแสดงต่อยูสเซอร์
(User) โดยวิธีการกาหนดให้เฉพาะที่จาเป็ นต่อการใชง้ านเท่าน้นั ในขณะที่ กิตติ ภกั ดีวฒั นกุล
และศิริวรรณ อมั พรดนยั (2544, หนา้ 15) กล่าววา่ อินเทอร์เฟส ทาหนา้ ที่เป็นหนา้ กากท่ีใชต้ ิดต่อกบั
วตั ถุอ่ืน และส่วนอิมพลีเมนต์ คือ ส่วนที่ถูกปิ ดบงั เอาไวภ้ ายใตห้ นา้ กากของอินเทอร์เฟส ซ่ึงวตั ถุ
อ่ืนไมส่ ามารถมองเห็นได้

260

อินเทอร์เฟส เป็ นการสร้างส่วนที่มีลักษณะคล้ายกับคลาส โดยระบุคุณสมบัติของ
อินเทอร์เฟสโดยประกาศส่วนเมธอดเป็ น public เพ่ือให้ผทู้ ่ีใชง้ านสามารถเขา้ ถึงได้ โดยส่วนของ
เมธอดจะระบุเพียงพารามิเตอร์ และชนิดของค่าที่จะคืนกลับเท่าน้ัน การใช้สัญลักษณ์ของ

อินเทอร์เฟส คือ สาหรับใช้เป็ นสัญลกั ษณ์ของการอิมพลีเมนต์ และใช้
สัญลกั ษณ์ของอินเทอร์เฟสดงั น้ี

ภาพที่ 8.1 แสดงไดอะแกรมของอินเทอร์เฟส
การนาไปใชง้ านจะใชค้ วามสัมพนั ธ์ดงั น้ี

ภาพที่ 8.2 แสดงความสมั พนั ธ์การอิมพลีเมนตเ์ พื่อใชง้ านอินเทอร์เฟส

261

โครงโปรแกรมการสร้างอินเทอร์เฟส
interface interfaceName{
public returnType methodA(Parameter);
public returnType methodB(Parameter);
public returnType methodC(Parameter);

}

โครงโปรแกรมของคลาสที่อิมพลเี มนต์
class implementClass implements interfaceName{
public returnType methodA(Parameter){

//implement โดยการเขียนโคด้
}
public returnType methodB(Parameter){

//implement โดยการเขียนโคด้
}
public returnType methodC(Parameter){

//implement โดยการเขียนโคด้
}

}

ตัวอย่างที่ 8.1 จงออกแบบอินเทอร์เฟสของเคร่ืองคิดเลข และแสดงคลาสไดอะแกรม พร้อมแสดง
รหสั โปรแกรม

แนวคิดการออกแบบเมธอดของอินเทอร์เฟสน้ีคือ บวก ลบ คูณ และหาร เป็ นหลกั แต่ละ
เมธอดมีการคืนค่าผลเป็นเลขทศนิยม โดยผา่ นพารามิเตอร์สองค่า

262

ภาพที่ 8.3 แสดงอินเทอร์เฟสของเคร่ืองคิดเลข
โปรแกรม :
public interface CalculatorInterface {

public double plus(double number1,double number2);
public double minus(double number1,double number2);
public double multiply(double number1,double number2);
public double divide(double number1,double number2);
}
ตัวอย่างที่ 8.2 จงออกแบบอินเทอร์เฟสของการลงจอดยานอวกาศไทยไทย โดยมีเมธอดการลงจอด
อยสู่ ่ีลกั ษณะคือ จอดบนพ้ืนแขง็ เรียบ จอดบนพ้ืนแขง็ ขรุขระ จอดบนพ้ืนโคลน และจอดในน้า โดย
กาหนดให้รายงานผลเม่ือลงจอดเสร็จแลว้ และการส่ังลงจอดจะตอ้ งป้ อนพารามิเตอร์เป็ นปริมาณ
เช้ือเพลิงเป็นปริมาณตวั เลขจานวนเตม็

แนวคิด smootFloorHard, HardFloorHard, mudFloor, waterFloor ซ่ึงค่าที่คืนคือ String
และพารามิเตอร์คือ int

ภาพท่ี 8.4 แสดงอินเทอร์เฟสของตวั อยา่ งที่ 8.2

263

public interface ThaiThaiSpaceShip {
public String smootFloorHard(int fuel);
public String hardFloorHard(int fuel);
public String mudFloor(int fuel);
public String waterFloor(int fuel);

}
ตัวอย่างที่ 8.3 จากตวั อยา่ งท่ี 8.1 และ 8.2 จงเขียนคลาสไดอะแกรมและโครงของคลาสสาหรับ
อิมพลีเมนตส์ าหรับอินเทอร์เฟสท้งั สอง
คลาสไดอะแกรม

ภาพที่ 8.5 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.3 ส่วนที่ 1
โครงโปรแกรมของ Calculator
class Calculator implements CalculatorInterface{

public double plus(double number1, double number2){
//โคด้ สาหรับการคานวณบวก

264

}
… //เขียนส่วนการคานวณอื่น ๆ ใหค้ รบ
}

ภาพที่ 8.6 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.3 ส่วนท่ี 2
โครงโปรแกรม
class implSpaceShip implements ThaiThaiSpaceShip {

public Stirng smootFloorHard(int fuel){
//โคด้ ส่วนการลงจอดบนพ้นื แขง็ เรียบ

}
… //เขียนโคด้ ส่วนของเมธอดอื่น ๆ ท้งั หมด
}

265

ตัวอย่างที่ 8.4 จงออกแบบโปรแกรมเครื่องคิดเลขโดยออกแบบให้ยดื หยุน่ ท่ีสุด โดยมีส่วนของการ
คานวณ บวก ลบ คูณ และหาร แยกอิสระจากกันโดยแต่ละส่วนมีเมธอดสาหรับการคานวณ
อยา่ งนอ้ ยสองเมธอด
คลาสไดอะแกรม

ภาพท่ี 8.7 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.4

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public interface plusInterface {

public double plusTypeA(double number1,double number2);
public int plusTypeB(int number1,int number2);
}
----------------------------------------------------------------------------------------------------------------------
public interface minusInterface {
public double minusTypeA(double number1,double number2);
public int minusTypeB(int number1,int number2);
}
----------------------------------------------------------------------------------------------------------------------
public interface multiplyInterface {
public double plusTypeA(double number1,double number2);
public int plusTypeB(int number1,int number2);

266

}
----------------------------------------------------------------------------------------------------------------------
public interface divideInterface {

public double plusTypeA(double number1,double number2);
public int plusTypeB(int number1,int number2);
}
----------------------------------------------------------------------------------------------------------------------

การใช้งานอนิ เทอร์เฟสแบบเดยี่ ว

การใชง้ านอินเทอร์เฟสน้นั ตอ้ งนามาอิมพลีเมนตแ์ ละเขียนเมธอดใหมต่ ามท่ีผใู้ ชต้ อ้ งการนา
และไปเขียนรหสั โปรแกรมตามที่ตอ้ งการ สาหรับแนวทางการใชง้ านของอินเทอร์เฟสอาจเรียกใช้
งานโดยเขียนคลาสอิมพลีเมนต์ แลว้ เขียนคลาสสาหรับรันโปรแกรมทางานดงั รูป

ภาพท่ี 8.8 แสดงคลาสไดอะแกรมของการใชง้ านอินเทอร์เฟสแบบเดี่ยว
โครงโปรแกรมเพิ่มเติมจากส่วนท่ีไดก้ ล่าวไปแลว้ ดงั น้ี

class MainProgram {
implementClass implObj = new implementClass();
public static void main(String args[]) {


267

}
ตวั อย่างท่ี 8.5 จากตวั อยา่ งท่ี 8.1 จงเขียนโปรแกรมใหส้ มบรู ณ์ ใหส้ ามารถคานวณไดจ้ ริงโดยการใช้
งาน Swing GUI
คลาสไดอะแกรม

ภาพที่ 8.9 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.5
----------------------------------------------------------------------------------------------------------------------
public interface CalculatorInterface {

public double plus(double number1,double number2);
public double minus(double number1,double number2);
public double multiply(double number1,double number2);
public double divide(double number1,double number2);
}
----------------------------------------------------------------------------------------------------------------------
public class Calculator implements CalculatorInterface{
public double plus(double number1,double number2){

return number1+number2;

268

}
public double minus(double number1,double number2){

return number1-number2;
}
public double multiply(double number1,double number2){

return number1*number2;
}
public double divide(double number1,double number2){

return number1/number2;
}
}
----------------------------------------------------------------------------------------------------------------------
ส่วนหวั ของคลาสทใ่ี ช้รันโปรแกรม
public class AppCalculation extends javax.swing.JFrame {
Calculator c = new Calculator();
----------------------------------------------------------------------------------------------------------------------
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

double n1=Double.parseDouble(jTextField1.getText());
double n2=Double.parseDouble(jTextField2.getText());
jTextField3.setText(String.valueOf(c.plus(n1, n2)));
}
----------------------------------------------------------------------------------------------------------------------
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
double n1=Double.parseDouble(jTextField1.getText());
double n2=Double.parseDouble(jTextField2.getText());
jTextField3.setText(String.valueOf(c.minus(n1, n2)));
}
----------------------------------------------------------------------------------------------------------------------
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
double n1=Double.parseDouble(jTextField1.getText());

269

double n2=Double.parseDouble(jTextField2.getText());
jTextField3.setText(String.valueOf(c.multiply(n1, n2)));
}
----------------------------------------------------------------------------------------------------------------------
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
double n1=Double.parseDouble(jTextField1.getText());
double n2=Double.parseDouble(jTextField2.getText());
jTextField3.setText(String.valueOf(c.divide(n1, n2)));
}

ผลการรัน แสดงดงั รูป

ภาพที่ 8.10 แสดงผลการรันของตวั อยา่ งที่ 8.5
ตัวอย่างที่ 8.6 จงใช้อินเทอร์เฟสจากตวั อย่างท่ี 8.2 โดยออกแบบโปรแกรมประยุกต์การลงจอด
ใหเ้ ห็นผล โดยออกแบบโปรแกรมดงั น้ี

ภาพท่ี 8.11 แสดงการออกแบบส่วนการติดตอ่ ของตวั อยา่ งที่ 8.6

270

คลาสไดอะแกรม

ภาพท่ี 8.12 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.6

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public interface ThaiThaiSpaceShip {

public String smootFloorHard(int fuel);
public String hardFloorHard(int fuel);
public String mudFloor(int fuel);
public String waterFloor(int fuel);
}
----------------------------------------------------------------------------------------------------------------------
public class implThaiThaiSpaceShip implements ThaiThaiSpaceShip{
public String smootFloorHard(int fuel){

return ("พ้ืนแขง็ ครับแตเ่ รียบ ใชเ้ ช้ือเพลิง:"+fuel);
}
public String hardFloorHard(int fuel){
return ("พ้ืนแขง็ ครับแถมขรุขระอีกแน่ะ ใชเ้ ช้ือเพลิง:"+fuel);

271

}
public String mudFloor(int fuel){
return ("พ้นื โคลนครับเละเลย ใชเ้ ช้ือเพลิง:"+fuel);
}
public String waterFloor(int fuel){
return ("ลงน้าครับจมคร่ึงยานแต่เรียบ ใชเ้ ช้ือเพลิง:"+fuel);
}
}
----------------------------------------------------------------------------------------------------------------------
ส่วนหัวโปรแกรมสาหรับรัน
public class ThaiSpaceShipApp extends javax.swing.JFrame {
implThaiThaiSpaceShip thaisp = new implThaiThaiSpaceShip();
ส่วนการควบคุมป่ มุ
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String output="";

if(jRadioButton1.isSelected()){
output=thaisp.smootFloorHard(Integer.parseInt(jTextField1.getText()));

}else
if(jRadioButton2.isSelected()){
output=thaisp.hardFloorHard(Integer.parseInt(jTextField1.getText()));
}else
if(jRadioButton3.isSelected()){
output=thaisp.mudFloor(Integer.parseInt(jTextField1.getText()));
}else
if(jRadioButton4.isSelected()){
output=thaisp.waterFloor(Integer.parseInt(jTextField1.getText()));
}
jTextField2.setText(output);
}
----------------------------------------------------------------------------------------------------------------------

272

ส่วนแอตทริบวิ เตอร์เพม่ิ เติม
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JRadioButton jRadioButton1;
private javax.swing.JRadioButton jRadioButton2;
private javax.swing.JRadioButton jRadioButton3;
private javax.swing.JRadioButton jRadioButton4;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั ภาพ

ภาพท่ี 8.13 แสดงผลการรันของตวั อยา่ งที่ 8.6

การใช้งานอินเทอร์เฟสน้ันอาจไม่จาเป็ นสาหรับการสร้างคลาสแยกระหว่างคลาสท่ี
อิมพลีเมนต์และคลาสสาหรับรันโปรแกรมก็ได้ อาจรวมกันกับคลาสที่ใช้สาหรับการรันและ
อิมพลีเมนตใ์ นคลาสเดียวกนั ก็ได้ ตวั อยา่ งการใชง้ านแสดงดงั ตวั อยา่ งต่อไปน้ี

273

ตัวอย่างท่ี 8.7 จงเขียนโปรแกรมเครื่องคิดเลขใน 6.1 โดยใชค้ ลาสอิมพลีเมนตเ์ ป็ นคลาสหลกั ดว้ ย
โดยใหค้ านวณการระหวา่ ง x=10.6 และ y=900.5
คลาสไดอะแกรม

ภาพท่ี 8.14 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.7
โปรแกรม :
-----------------------------------------------------------------------------------------------------------
public interface CalculatorInterface {

public double plus(double number1,double number2);
public double minus(double number1,double number2);
public double multiply(double number1,double number2);
public double divide(double number1,double number2);
}
-----------------------------------------------------------------------------------------------------------
public class implAndMain implements CalculatorInterface{
private static double x=10.6;
private static double y=900.5;
public double plus(double number1,double number2){

return number1+number2;

274

}
public double minus(double number1,double number2){

return number1-number2;
}
public double multiply(double number1,double number2){

return number1*number2;
}
public double divide(double number1,double number2){

return number1/number2;
}
public static void main(String args[]){

implAndMain obj=new implAndMain();
System.out.println("x+y="+obj.plus(x,y));
System.out.println("x-y="+obj.minus(x,y));
System.out.println("x*y="+obj.multiply(x,y));
System.out.println("x/y="+obj.divide(x,y));
}
}
-----------------------------------------------------------------------------------------------------------
ผลการรันโปรแกรม
x+y=911.1
x-y=-889.9
x*y=9545.3
x/y=0.011771238200999444

คาอธิบาย หลงั จากอิมพลีเมนตม์ าแลว้ อาจมีการเขียนเมธอดเพมิ่ หรือทาโอเวอร์โหลดดิ้ง
เพม่ิ เติมได้

275

ตัวอย่างท่ี 8.8 จงเขียนอินเทอร์เฟสสาหรับควบคุมการเคลื่อนไหวของตวั การ์ตูนโดยให้มี
คุณลักษณะการเคลื่อนไหวในส่ีทิศทางพ้ืนราบ หลงั จากน้ันเขียนส่วนการอิมพลีเมนต์ให้เพ่ิม
ลกั ษณะการกระโดดสูงและดาดินดว้ ย
คลาสไดอะแกรม

ภาพที่ 8.15 แสดงคลาสไดอะแกรมของตวั อยา่ งท่ี 8.8
โปรแกรม :
-----------------------------------------------------------------------------------------------------------
public interface InterfaceCartoon {
public String moveForward();
public String moveBackward();
public String moveLeft();
public String moveRight();
}
-----------------------------------------------------------------------------------------------------------
public class implCartoon implements InterfaceCartoon{
public String moveForward(){
return "ไปขา้ งหนา้ เรียบร้อย";
}

276

public String moveBackward(){
return "ถอยหลงั เรียบร้อย";

}
public String moveLeft(){

return "ขยบั ซา้ ยเรียบร้อย";
}
public String moveRight(){

return "ขยบั ขวาเรียบร้อย";
}
public String moveUp(){

return "กระโดดสูงเรียบร้อย";
}
public String moveDown(){

return "ดาดินเรียบร้อย";
}
}
-----------------------------------------------------------------------------------------------------------
public class mainAnimation {
private static implCartoon ObjCartoon = new implCartoon();
public static void main(String args[]){

System.out.println(ObjCartoon.moveBackward());
System.out.println(ObjCartoon.moveForward());
System.out.println(ObjCartoon.moveLeft());
System.out.println(ObjCartoon.moveRight());
System.out.println(ObjCartoon.moveUp());
System.out.println(ObjCartoon.moveDown());
}
}
-----------------------------------------------------------------------------------------------------------

ผลการรัน แสดงดงั น้ี

277

ถอยหลงั เรียบร้อย
ไปขา้ งหนา้ เรียบร้อย
ขยบั ซา้ ยเรียบร้อย
ขยบั ขวาเรียบร้อย
กระโดดสูงเรียบร้อย
ดาดินเรียบร้อย

ตัวอย่างท่ี 8.9 จากตวั อยา่ งที่ 8.8 จงเขียนส่วนของโอเวอร์โหลดดิ้งเมธอดการเคล่ือนไหวท้งั หมด
โดยระบุใหม้ ีขีดความสามารถในการหมุนตวั เพมิ่ โดยระบุจานวนรอบของการหมุนเป็นพารามิเตอร์
คลาสไดอะแกรม

ภาพที่ 8.16 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.9
โปรแกรม :
-----------------------------------------------------------------------------------------------------------
public interface InterfaceCartoon {

278

public String moveForward();
public String moveBackward();
public String moveLeft();
public String moveRight();
}
-----------------------------------------------------------------------------------------------------------
public class implAndOverload implements InterfaceCartoon{
public String moveForward(){

return "ไปขา้ งหนา้ เรียบร้อย";
}
public String moveBackward(){

return "ถอยหลงั เรียบร้อย";
}
public String moveLeft(){

return "ขยบั ซา้ ยเรียบร้อย";
}
public String moveRight(){

return "ขยบั ขวาเรียบร้อย";
}
public String moveUp(){

return "กระโดดสูงเรียบร้อย";
}
public String moveDown(){

return "ดาดินเรียบร้อย";
}
public String moveForward(int round){

return "ไปขา้ งหนา้ พร้อมหมุน "+round+" รอบ";
}
public String moveBackward(int round){

return "ถอยหลงั พร้อมหมุน "+round+" รอบ";

279

}
public String moveLeft(int round){

return "ขยบั ซา้ ยพร้อมหมุน "+round+" รอบ";
}
public String moveRight(int round){

return "ขยบั ขวาพร้อมหมุน "+round+" รอบ";
}
public String moveUp(int round){

return "กระโดดสูงพร้อมหมุน "+round+" รอบ";
}
public String moveDown(int round){

return "ดาดินพร้อมหมุน "+round+" รอบ";
}
}
-----------------------------------------------------------------------------------------------------------
public class mainAnimation {
private static implAndOverload ObjCartoon = new implAndOverload();
public static void main(String args[]){

System.out.println(ObjCartoon.moveBackward());
System.out.println(ObjCartoon.moveForward());
System.out.println(ObjCartoon.moveLeft());
System.out.println(ObjCartoon.moveRight());
System.out.println(ObjCartoon.moveUp());
System.out.println(ObjCartoon.moveDown());
System.out.println(ObjCartoon.moveBackward(50));
System.out.println(ObjCartoon.moveForward(10));
System.out.println(ObjCartoon.moveLeft(60));
System.out.println(ObjCartoon.moveRight(70));
System.out.println(ObjCartoon.moveUp(20));
System.out.println(ObjCartoon.moveDown(10));

280

}
}
-----------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
ถอยหลงั เรียบร้อย
ไปขา้ งหนา้ เรียบร้อย
ขยบั ซา้ ยเรียบร้อย
ขยบั ขวาเรียบร้อย
กระโดดสูงเรียบร้อย
ดาดินเรียบร้อย
ถอยหลงั พร้อมหมุน 50 รอบ
ไปขา้ งหนา้ พร้อมหมุน 10 รอบ
ขยบั ซา้ ยพร้อมหมุน 60 รอบ
ขยบั ขวาพร้อมหมุน 70 รอบ
กระโดดสูงพร้อมหมุน 20 รอบ
ดาดินพร้อมหมุน 10 รอบ

การใช้งานอนิ เทอร์เฟสร่วมกนั

ความสามารถของอินเทอร์เฟสช่วยแกป้ ัญหาเรื่องขอ้ จากดั ของคลาสท่ีไม่สามารถสืบทอด
คุณสมบตั ิได้หลาย ๆ คลาส แต่อินเทอร์เฟสสามารถทาได้ กล่าวคือสามารถสร้างอินเทอร์เฟส
หลาย ๆ อินเทอร์เฟสท่ีเก่ียวข้องกันแล้วอิมพลีเมนต์มาใช้งานได้ ดังตวั อย่างท่ี 8.4 ท่ีสร้าง
อินเทอร์เฟสการคานวณ บวก ลบ คูณ หาร เอาไวต้ ่างอินเทอร์เฟสกนั เมื่อต้องการนามาใช้งาน
สามารถอิมพลีเมนตม์ าใชร้ ่วมกนั ได้ นอกจากน้นั ยงั สามารถสร้างสิ่งที่ไม่เกี่ยวขอ้ งกนั ให้เก่ียวขอ้ ง
กนั ไดอ้ ีกดว้ ย เช่น หากมีอินเทอร์เฟสนก อินเทอร์เฟสไส้เดือนดิน อินเทอร์เฟสงู โปรแกรมสามารถ
อิมพลีเมนตอ์ ินเทอร์เฟสท้งั สามเขา้ มาสร้างเป็นสัตวช์ นิดใหม่ ที่มีท้งั ความสามารถของนก ไส้เดือน
และงู ร่วมกนั ไดเ้ ป็นตน้ การสร้างความสมั พนั ธ์แบบน้ีเขียนคลาสไดอะแกรมไดด้ งั น้ี

281

ภาพท่ี 8.17 แสดงคลาสไดอะแกรมการใชง้ านอินเทอร์เฟสร่วมกนั
โครงโปรแกรมส่วนการอิมพลีเมนตค์ ือ
class implClass implements interface1,interface2,… {


}

ใหส้ ังเกตตวั อยา่ งตอ่ ไปน้ี
ตัวอย่างท่ี 8.10 จากตวั อย่างที่ 8.4 จงเขียนโปรแกรมให้สมบูรณ์สามารถคานวณตวั เลข a=500
b=700 x=30.8 และ y=90.5 ในการคานวณบวก ลบ คูณ และหาร
คลาสไดอะแกรม

282

ภาพที่ 8.18 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.10
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public interface plusInterface {

public double plusTypeA(double number1,double number2);
public int plusTypeB(int number1,int number2);
}
----------------------------------------------------------------------------------------------------------------------
public interface minusInterface {
public double minusTypeA(double number1,double number2);
public int minusTypeB(int number1,int number2);

283

}
----------------------------------------------------------------------------------------------------------------------
public interface multiplyInterface {

public double multiplyTypeA(double number1,double number2);
public int multiplyTypeB(int number1,int number2);
}
----------------------------------------------------------------------------------------------------------------------
public interface divideInterface {
public double divideTypeA(double number1,double number2);
public int divideTypeB(int number1,int number2);
}
----------------------------------------------------------------------------------------------------------------------
public class implCalculator implements plusInterface,minusInterface,

multiplyInterface,divideInterface{
public double plusTypeA(double number1, double number2) {

return number1+number2;
}
public int plusTypeB(int number1, int number2) {

return number1+number2;
}
public double minusTypeA(double number1, double number2) {

return number1-number2;
}
public int minusTypeB(int number1, int number2) {

return number1-number2;
}
public double multiplyTypeA(double number1,double number2) {

return number1*number2;
}
public int multiplyTypeB(int number1,int number2) {

284

return number1*number2;
}
public double divideTypeA(double number1,double number2) {

return number1/number2;
}
public int divideTypeB(int number1,int number2) {

return number1/number2;
}
}
----------------------------------------------------------------------------------------------------------------------
public class calculatorApplication {
private static implCalculator casio = new implCalculator();
private static int a=500;
private static int b=700;
private static double x=30.8;
private static double y=90.5;
public static void main(String args[]){

System.out.println("x+y="+casio.plusTypeA(x, y));
System.out.println("x-y="+casio.minusTypeA(x, y));
System.out.println("x*y="+casio.multiplyTypeA(x, y));
System.out.println("x/y="+casio.divideTypeA(x, y));
System.out.println("a+b="+casio.plusTypeB(a, b));
System.out.println("a-b="+casio.minusTypeB(a, b));
System.out.println("a*b="+casio.multiplyTypeB(a, b));
System.out.println("a/b="+casio.divideTypeB(a, b));
}
}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
x+y=121.3

285

x-y=-59.7
x*y=2787.4
x/y=0.3403314917127072
a+b=1200
a-b=-200
a*b=350000
a/b=0

ตัวอย่างที่ 8.11 กาหนดให้มีอินเทอร์เฟสนกสามารถบินได อินเทอร์เฟสไส้เดือนสามารถมุดดิน
และอินเทอร์เฟสงูสามารถพน่ พษิ ได้ จงเขียนโปรแกรมเพ่ือสร้างสัตวช์ นิดใหม่ให้มีคุณลกั ษณะเด่น
ดงั กล่าวในการทาพฤติกรรมของสัตวช์ นิดใหมน่ ้ี
การวเิ คราะห์รายละเอียดของอินเทอร์เฟสไดด้ งั น้ี
นก(Bird): บิน: fly
ไส้เดือน(earthWorm): duckEarth
งู(Snake): พน่ พษิ :blowPoison
สัตวม์ หศั จรรย(์ miracleAnimal)
คลาสไดอะแกรม

ภาพที่ 8.19 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 8.11

286

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public interface Bird {

public String fly();
}
----------------------------------------------------------------------------------------------------------------------
public interface earthWorm {

public String duckEarth();
}
----------------------------------------------------------------------------------------------------------------------
public interface Snake {

public String blowPoison();
}
----------------------------------------------------------------------------------------------------------------------
public class miracleAnimal implements Bird,earthWorm,Snake {

public String fly() {
return "ฉนั บินแลว้ นะจ๊ะ.";

}
public String duckEarth() {

return "ฉนั มุดดินนะจะ๊ .";
}
public String blowPoison() {
return "ฉนั พน่ พษิ นะ ระวงั ล่ะ.";
}
}
----------------------------------------------------------------------------------------------------------------------
public class mainMiracleAnimal {
public static miracleAnimal kungKing = new miracleAnimal();
public static void main(String args[]){

System.out.println(kungKing.fly());

287

System.out.println(kungKing.blowPoison());
System.out.println(kungKing.duckEarth());
}
}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
ฉนั บินแลว้ นะจะ๊ .
ฉนั พน่ พษิ นะ ระวงั ล่ะ.
ฉนั มุดดินนะจะ๊ .

ตัวอย่างท่ี 8.12 จากตวั อย่างที่ 8.10 สร้างเครื่องคิดเลข และตวั อย่างท่ี 8.11 สร้างสัตวม์ หัศจรรย์
จงเขียนโปรแกรมสร้างความฉลาดให้กบั สัตว์มหัศจรรย์โดยให้มีความสามารถในการคานวณ
ตวั เลขไดท้ ้งั ตวั เลขทศนิยมและเลขจานวนเตม็ โดยสร้างส่วนติดตอ่ กบั ผใู้ ชเ้ ป็นแบบจาวาสวงิ
คลาสไดอะแกรม

ภาพท่ี 8.20 แสดงคลาสไดอะแกรมของตวั อยา่ งท่ี 8.12

288

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
public class smarterMiracleAnimal implements plusInterface,minusInterface,

multiplyInterface,divideInterface,Bird,earthWorm,Snake {
public String fly() {

return "ฉนั บินนะแลว้ นะจะ๊ .";
}
public String duckEarth() {

return "ฉนั มุดดินนะจะ๊ .";
}
public String blowPoison() {
return "ฉนั พน่ พิษนะ ระวงั ล่ะ.";
}

public double plusTypeA(double number1, double number2) {
return number1+number2;
}
public int plusTypeB(int number1, int number2) {
return number1+number2;
}
public double minusTypeA(double number1, double number2) {
return number1-number2;
}
public int minusTypeB(int number1, int number2) {
return number1-number2;
}
public double multiplyTypeA(double number1,double number2) {
return number1*number2;
}
public int multiplyTypeB(int number1,int number2) {
return number1*number2;

289

}
public double divideTypeA(double number1,double number2) {

return number1/number2;
}
public int divideTypeB(int number1,int number2) {

return number1/number2;
}
}
----------------------------------------------------------------------------------------------------------------------

หลงั จากน้นั ออกแบบส่วนติดตอ่ ผใู้ ช้ ดงั น้ี

ภาพที่ 8.21 แสดงการออกแบบส่วนการติดต่อของตวั อยา่ งที่ 8.12

โปรแกรมส่วนการรันโปรแกรม
----------------------------------------------------------------------------------------------------------------------
ส่วนหัว
public class miracleApplication extends javax.swing.JFrame {

smarterMiracleAnimal jomJam =new smarterMiracleAnimal();
----------------------------------------------------------------------------------------------------------------------
ป่ ุมพ่นพษิ

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
jTextField3.setText(jomJam.blowPoison());

290

}
----------------------------------------------------------------------------------------------------------------------
ป่ มุ มุดดนิ

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
jTextField3.setText(jomJam.duckEarth());

}
----------------------------------------------------------------------------------------------------------------------
ป่ มุ บิน

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
jTextField3.setText(jomJam.fly());

}
----------------------------------------------------------------------------------------------------------------------
ป่ ุมคานวณทศนิยม
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

double x=Double.parseDouble(jTextField1.getText());
double y=Double.parseDouble(jTextField2.getText());
String result="Plus:"+String.valueOf(jomJam.plusTypeA(x,y))+","+

"Minus:"+String.valueOf(jomJam.minusTypeA(x,y))+","+
"Multiply:"+String.valueOf(jomJam.multiplyTypeA(x,y))+","+
"Divide:"+String.valueOf(jomJam.divideTypeA(x,y));
jTextField3.setText(result);
}
----------------------------------------------------------------------------------------------------------------------
ป่ มุ คานวณจานวนเต็ม
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
int x=(int)Double.parseDouble(jTextField1.getText());
int y=(int)Double.parseDouble(jTextField2.getText());
String result="Plus:"+String.valueOf(jomJam.plusTypeB(x,y))+","+
"Minus:"+String.valueOf(jomJam.minusTypeB(x,y))+","+
"Multiply:"+String.valueOf(jomJam.multiplyTypeB(x,y))+","+

291

"Divide:"+String.valueOf(jomJam.divideTypeB(x,y));
jTextField3.setText(result);
}
----------------------------------------------------------------------------------------------------------------------
ป่ มุ ปิ ด
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
----------------------------------------------------------------------------------------------------------------------
ส่วนท้าย
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
private javax.swing.JButton jButton6;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั ภาพต่อไปน้ี

292

ภาพท่ี 8.22 แสดงผลการรันของตวั อยา่ งที 8.12

การใช้งานอนิ เทอร์เฟสร่วมกบั การรับทอด

ความสามารถของอินเทอร์เฟสน้นั ยดื หยุน่ มาก สามารถนามาใชง้ านร่วมกบั คุณสมบตั ิของ
การสืบทอดได้ กล่าวคือสามารถสร้างคลาสปกติ และทาการสืบทอดด้วย extends ตามปกติ
หลังจ า กน้ ันส า มา ร ถส ร้ า ง อิ น เ ทอ ร์ เ ฟ สจ า กห น่ึ ง ห รื อ ม าก กว่า หน่ึ ง อิ น เท อ ร์ เ ฟ สแ ละ ท าก า ร
implements ตามแนวทางที่ไดเ้ สนอไปแลว้ ได้ สามารถยกตวั อยา่ งคลาสไดอะแกรมไดด้ งั น้ี

ภาพที่ 8.23 แสดงไดอะแกรมแนวคิดการใชง้ านอินเทอร์เฟสร่วมกบั การสืบทอด

293

โครงโปรแกรมคลาส implAndExtededClass
class implAndExtendedClass extends normalClass implements interface1,interface2,… {

//implement interface

}
การใชง้ านท่ีเห็นไดช้ ดั เจนท่ีสุดอาจใชง้ านเพียงอินเทอร์เฟสเดียว และคลาสเดียวสาหรับรัน
โปรแกรม ดงั ตวั อยา่ งท่ี 8.13

ตวั อย่างท่ี 8.13 จากตวั อยา่ งที่ 8.5 จงเขียนคลาส implAndExendCal โดยใชส้ วงิ ในการติดต่อผใู้ ช้
คลาสไดอะแกรม

ภาพที่ 8.24 แสดงคลาสไดอะแกรมของตวั อยา่ งท่ี 8.13
โปรแกรม :
ส่วนการอิมพลีเมนต์และการสืบทอด
----------------------------------------------------------------------------------------------------------------------
public class implAndExtendedCal extends javax.swing.JFrame implements CalculatorInterface {

implAndExtendedCal c =new implAndExtendedCal();
public double divide(double number1, double number2) {

return number1+number2;
}
public double minus(double number1, double number2) {

294

return number1-number2;
}
public double multiply(double number1, double number2) {

return number1*number2;
}
public double plus(double number1, double number2) {

return number1/number2;
}
--------------------------------------------------------------------------------------------------------------------

หลงั จากน้นั ออกแบบโปรแกรมส่วนการติดต่อดงั น้ี

ภาพท่ี 8.25 แสดงการออกแบบส่วนติดต่อของตวั อยา่ งท่ี 8.13
--------------------------------------------------------------------------------------------------------------------
ป่ ุม +

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
double x=Double.parseDouble(jTextField1.getText());
double y=Double.parseDouble(jTextField2.getText());
jTextField3.setText(String.valueOf(c.plus(x, y)));

}
--------------------------------------------------------------------------------------------------------------------
ป่ มุ -


Click to View FlipBook Version