47
http://www.siam2dev.com http://www.siam2dev.com 1 Polymorphism and Polymorphism and Interface Interface . . อออออออ ออออออออ อออออออ ออออออออ http://www.siam2dev.com http://www.siam2dev.com [email protected] [email protected]

Polymorphism and Interface

  • Upload
    sarila

  • View
    50

  • Download
    1

Embed Size (px)

DESCRIPTION

Polymorphism and Interface. อ. นัฐพงศ์ ส่งเนียม http://www.siam2dev.com [email protected]. โพลีมอร์ฟิซึม (Polymorphism). ความหมาย โพลีมอร์ฟิซึม หมายถึง แนวความคิดในการติดต่อด้วยวิธีเดียวกันกับหลายๆ สิ่ง ส่วนผลที่จะได้รับอาจแตกต่างกัน เป้าหมาย - PowerPoint PPT Presentation

Citation preview

Page 1: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 11

Polymorphism and Polymorphism and InterfaceInterfaceออ . . นัฐพงศ์ สง่เนียมนัฐพงศ์ สง่เนียมhttp://www.siam2dev.comhttp://[email protected]@hotmail.com

Page 2: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 22

โพลีมอรฟ์ซิมึ โพลีมอรฟ์ซิมึ (Polymorphism)(Polymorphism) ความหมายความหมาย

– โพลีมอรฟ์ซิมึ หมายถึง แนวความคิดในการติดต่อด้วยวธิีโพลีมอรฟ์ซิมึ หมายถึง แนวความคิดในการติดต่อด้วยวธิีเดียวกันกับหลายๆ สิง่ สว่นผลท่ีจะได้รบัอาจแตกต่างกันเดียวกันกับหลายๆ สิง่ สว่นผลท่ีจะได้รบัอาจแตกต่างกัน

เป้าหมายเป้าหมาย– ลดภาระในการจำาคำาสัง่ คำาสัง่เดียวติดต่อได้ทกุท่ี ลดภาระในการจำาคำาสัง่ คำาสัง่เดียวติดต่อได้ทกุท่ี (many (many

form)form)– ลดภาระในการแก้ไขคำาสัง่ภายในเมธอด สามารถเพิม่หรอืลดภาระในการแก้ไขคำาสัง่ภายในเมธอด สามารถเพิม่หรอื

แก้ไขรายละเอียดภายในเมธอดชื่อเดิมได้ แก้ไขรายละเอียดภายในเมธอดชื่อเดิมได้ (override) (override) โดยไมก่ระทบกระเทือนของเดิมโดยไมก่ระทบกระเทือนของเดิม

Page 3: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 33

ตัวอยา่งโพลีมอรฟ์ซิมึตัวอยา่งโพลีมอรฟ์ซิมึ ระบบพนักงาน ระบบพนักงาน (Employee System)(Employee System)

– ในบรษัิทแหง่หนึ่งมพีนักงาน ในบรษัิทแหง่หนึ่งมพีนักงาน 2 2 ประเภท คือ พนักงานรายเดือน ประเภท คือ พนักงานรายเดือน (Salaried Employee) (Salaried Employee) พนักงานรายชัว่โมง พนักงานรายชัว่โมง (Hourly (Hourly Employee) Employee) ในแต่ละเดือนบรษัิทต้องคำานวณการจา่ยเงินให้ในแต่ละเดือนบรษัิทต้องคำานวณการจา่ยเงินให้พนักงาน วธิคิีดแตกต่างกัน แต่อยา่งไรก็ตามพนักงานทัง้สองพนักงาน วธิคิีดแตกต่างกัน แต่อยา่งไรก็ตามพนักงานทัง้สองประเภทก็มลัีกษณะรว่มกัน ได้แก่ หมายเลขประจำาตัว ชื่อ แผนก ประเภทก็มลัีกษณะรว่มกัน ได้แก่ หมายเลขประจำาตัว ชื่อ แผนก

– ในอนาคตอาจมพีนักงานจา้งตามชิน้งาน ในอนาคตอาจมพีนักงานจา้งตามชิน้งาน (Piece (Piece Employee) Employee) เพิม่มา เพิม่มา ??

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

Page 4: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 44

ตัวอยา่งโพลีมอรฟ์ซิมึตัวอยา่งโพลีมอรฟ์ซิมึ

Employee

SalariedEmployee HourlyEmployee

Page 5: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 55

ตัวอยา่งโพลีมอรฟ์ซิมึตัวอยา่งโพลีมอรฟ์ซิมึpublic class Employee {

protected String firstName;protected String lastName;protected String pid; // personal idpublic Employee () { firstName =""; lastName=""; pid="";}public Employee(String newFirstName, String newLastName,

String newPid){

firstName = newFirstName;lastName = newLastName;pid = newPid;

} //end

Employee.java

Continue

Page 6: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 66

public void setName(String newFirstName, String newLastName){ firstName = newFirstName; lastName = newLastName;

}public void setPid(String newPid){

pid = newPid;}public String getName(){

return firstName + " " + lastName;}public String getPid(){

return pid;}public double pay(){ return 0;}public String toString() {

return "PID :" + pid + " Name :" + getName();}

}//end Employee

Employee.java

Page 7: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 77

public class SalariedEmployee extends Employee{

protected double salary;public SalariedEmployee () { }public SalariedEmployee(String fName, String lName,

String newPid,double newSalary){

super(fName,lName,newPid);salary = newSalary;

} //end

public void setSalary(double newSalary){ salary = newSalary;

}public double pay(){ return salary;}public String toString() {

return super.toString () + " Salary : " + salary;}

}//end SalariedEmployee

SalariedEmployee.java

Page 8: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 88

public class HourlyEmployee extends Employee {protected double hour;protected double rate;public HourlyEmployee () { hour =0;}public HourlyEmployee(String fName, String lName, String newPid, double h,double r){

super(fName,lName,newPid);hour = h; rate = r;

} //end

public void setHour(double newHour){ hour = newHour;

}public void setRate(double newRate){

rate = newRate;}public double pay(){ return hour * rate;}public String toString () {

return super.toString () + "\n\t\t Hour : " + hour + " Rate : " + rate + " Total : " + this.pay();

}}//end HourlyEmployee

HourlyEmployee.java

Page 9: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 99

public class EmployeeTest {

public static void main(String [] args ){

System.out.println("Polymorphism Testing!");Employee e = new Employee("Chery","Meesuk","36001");System.out.println("Employee : " + e.toString());

SalariedEmployee s = new SalariedEmployee("Vipa","Thongdee","36002",25000);

System.out.println("Salaried Employee : " + s.toString());

HourlyEmployee h = new HourlyEmployee("Anun","Kam", "346003",30, 150);

System.out.println("Hourly Employee :" + h.toString());System.out.println("\nThe reference of Parent class can refer to

an instance of its subclass");Employee emp[] = new Employee[2];emp[0] = s;emp[1] = h; System.out.println(emp[0].pay()); System.out.println(emp[1].pay()); } //end main method }

} //end EmployeeTest

EmployeeTest.java

Page 10: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1010

คณุสมบติัของโพลีมอรฟ์ซิมึในคณุสมบติัของโพลีมอรฟ์ซิมึในการเขยีนโปรแกรมการเขยีนโปรแกรม การอ้างอิงการอ้างอิง

– ตัวอ้างอิงของคลาสแมส่ามารถอ้างถึงอ็อบเจกต์ตัวอ้างอิงของคลาสแมส่ามารถอ้างถึงอ็อบเจกต์ท่ีสรา้งจากคลาสลกูได้ท่ีสรา้งจากคลาสลกูได้

– ตัวอ้างอิงของคลาสลกูไมส่ามารถอ้างถึงอ็อบเจตัวอ้างอิงของคลาสลกูไมส่ามารถอ้างถึงอ็อบเจกต์ท่ีสรา้งจากคลาสแมไ่ด้กต์ท่ีสรา้งจากคลาสแมไ่ด้Employee e;

SalariedEmployee s = new SalariedEmployee("Vipa","Thongdee","36002",25000);

e =s; // okEmployee ep = new Employee(“Anong”,”Ratmanee”,”3444”);SalairedEmployee t;T = ep ; //not ok

Page 11: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1111

คณุสมบติัของโพลีมอรฟ์ซิมึในคณุสมบติัของโพลีมอรฟ์ซิมึในการเขยีนโปรแกรมการเขยีนโปรแกรม

Employee emp[] = new Employee[2];emp[0] = s;emp[1] = h; System.out.println(emp[0].pay()); System.out.println(emp[1].pay());

Employee e1 = s;Employee e2 = h;

Employee e3 =new SalariedEmployee("Siri","Pongdee","36006",35000);

System.out.println(e3.toString());Employee e4 = new HourlyEmployee("Suchart","Kamkaew",

"346007",20, 2500);System.out.println(e4.toString());

Page 12: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1212

คลาสนามธรรม คลาสนามธรรม (Abstract (Abstract Classes)Classes) คลาสนามธรรม หมายถึงคลาสนามธรรม หมายถึง

– คลาสต้นแบบเท่านัน้ ไมส่ามารถนำาไปใชส้รา้ง คลาสต้นแบบเท่านัน้ ไมส่ามารถนำาไปใชส้รา้ง object object ของตัวของตัวเองได้เองได้

– มเีมธอดนามธรรม มเีมธอดนามธรรม (abstract methods) (abstract methods) เพื่อบงัคับใหค้ลาสเพื่อบงัคับใหค้ลาสลกูท่ีสบืทอดไปต้องนำาเอาเมธอดนัน้ไปดัดแปลงก่อนใชเ้สมอลกูท่ีสบืทอดไปต้องนำาเอาเมธอดนัน้ไปดัดแปลงก่อนใชเ้สมอ

ตัวอยา่งตัวอยา่ง– คลาส คลาส Employee Employee สามารถกำาหนดใหม้คีณุสมบติัขา้งต้นได้ คือสามารถกำาหนดใหม้คีณุสมบติัขา้งต้นได้ คือเมธอด เมธอด pay() pay() กับ กับ toString() toString() ได้รบัการได้รบัการ

ดัดแปลงดัดแปลง(overridden) (overridden)

Page 13: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1313

การสรา้งคลาสนามธรรมใน การสรา้งคลาสนามธรรมใน JavaJava

public abstract ShapeDrawing { protected Point point; //origin protected int wPicxel; // width protected int hPicxel; // height

public abstract void draw(Graphics g); } //end classpublic CircleDrawing extends ShapeDrawing { public CircleDrawing extends ShapeDrawing {

public void draw(Graphics g)public void draw(Graphics g) { g.drawOval(point.getX(),point.getY(),wPicxel,{ g.drawOval(point.getX(),point.getY(),wPicxel, hPicxel);hPicxel); }} } //end class} //end class

ไมต้่องมรีายละเอียด

สรา้ง Object ไมไ่ด้

สบืทอดจากคลาสนามธรรม

ดัดแปลงใหม่

Page 14: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1414

import java.awt*. ;public abstract class ShapeDrawing{ protected int x; protected int y; protected int wPicxel; protected int hPicxel;

public ShapeDrawing () { ; } public ShapeDrawing(int newX, int newY){

x = newX; y = newY; wPicxel = 50; hPicxel = 50;

}public ShapeDrawing(int newX, int newY, int w, int h){

x=newX; y = newY; wPicxel = w; hPicxel = h;

} public void setXY(int xx,int yy ) { x=xx; y = yy;} public void setWidthPicxel(int w ) { wPicxel = w;} public void setHeightPicxel(int h ) { hPicxel = h;} public void move(int xx,int yy){ setXY(xx,yy);} public abstract void draw(Graphics g);} //end class

ShapeDrawing.java

Page 15: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1515

import java.awt*;public class CircleDrawing extends ShapeDrawing {

public CircleDrawing(){ }public CircleDrawing(int newX,int newY,int w,int

h){ super(newX,newY,w,h);

}public void draw(Graphics g){

g.drawOval(x,y,wPicxel,hPicxel);}

} //end classimport java.awt*;public class RectangleDrawing extends ShapeDrawing {

public RectangleDrawing(){ }public RectangleDrawing(int newX,int newY,int w,

int h){ super(newX,newY,w,h);

}public void draw(Graphics g){

g.drawRect(x,y,wPicxel,hPicxel);}

} //end class

CircleDrawing.java

RectangleDrawing.java

Page 16: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1616

import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.awt.Point;public class ShapeTest extends JApplet implements MouseListener {

CircleDrawing myCircle;RectangleDrawing myRect;Object obj[];ShapeDrawing sh[];java.awt.Point cPoint;

String text;public static void main(String[] args) {

System.out.println("Application");}public void init() {

myCircle = new CircleDrawing(10,20,40,40);myRect = new RectangleDrawing(100,20,50,50); obj = new Object[2]; obj[0] = myCircle; obj[1] = myRect;cPoint = new Point(50,200);text = "draw";addMouseListener(this);

}

ShapeTest.java

Page 17: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1717

public void paint(Graphics g) {super.paint(g);for(int i =0;i< obj.length; i++)

((ShapeDrawing)obj[i]).draw(g);g.drawString(text,

(int)cPoint.getX(),(int)cPoint.getY());}

public void mousePressed(MouseEvent event) { cPoint= event.getPoint();

myCircle.move((int)cPoint.getX(),(int)cPoint.getY());text = "Move"; repaint();

} public void mouseClicked(MouseEvent event) { }

public void mouseReleased(MouseEvent event) { } public void mouseEntered(MouseEvent event) { }

public void mouseExited(MouseEvent event) { }}

ShapeTest.java

Polymorphism

Page 18: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1818

สรุปการใช ้สรุปการใช ้PolymorphismPolymorphism สรา้งคลาสแมท่ี่บรรจุเมธอดทัง้หมดท่ีจำาเป็นในสรา้งคลาสแมท่ี่บรรจุเมธอดทัง้หมดท่ีจำาเป็นใน

การแก้ปัญหาการแก้ปัญหา– เมธอดใด ท่ีมคีวามเฉพาะตัวตามคลาสลกูท่ีสบืทอดเมธอดใด ท่ีมคีวามเฉพาะตัวตามคลาสลกูท่ีสบืทอด

ไป ต้องประกาศเป็น ไป ต้องประกาศเป็น abstractabstract methodmethod นิยามคลาสลกูที่สบืทอดมา และนำาเอาเมธอดนิยามคลาสลกูที่สบืทอดมา และนำาเอาเมธอด

นามธรรมมาดัดแปลงใหม่นามธรรมมาดัดแปลงใหม่ สรา้ง สรา้ง Object Object จากคลาสลกูต่างๆ และอ้างถึงอ็จากคลาสลกูต่างๆ และอ้างถึงอ็

อบเจกต์เหล่านัน้โดยใชตั้วอ้างอิงจากคลาสแม ่อบเจกต์เหล่านัน้โดยใชตั้วอ้างอิงจากคลาสแม ่(super class references)(super class references)

Page 19: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 1919

การป้องกันดัดแปลงเมธอด และการป้องกันดัดแปลงเมธอด และสบืทอดคลาส สบืทอดคลาส (final (final methods and classes)methods and classes) การป้องกันการดัดแปลงเมธอดของคลาสแม่การป้องกันการดัดแปลงเมธอดของคลาสแม่

ในคลาสลกูในคลาสลกู– ใช ้ใช ้final final ประกาศหน้าเมธอดของคลาสแม ่แล้วประกาศหน้าเมธอดของคลาสแม ่แล้ว

คลาสลกูจะไมส่ามารถดัดแปลงเมธอดนัน้ได้อีก คลาสลกูจะไมส่ามารถดัดแปลงเมธอดนัน้ได้อีก (not overridden)(not overridden)

– เมธอดท่ีประกาศเป็น เมธอดท่ีประกาศเป็น static static ถือวา่เป็น ถือวา่เป็น final final โดยอัตโนมติัโดยอัตโนมติั

Public class T { public T() { } public final void method1(){ System.out.println(“ Final method”); } } //end class

Page 20: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2020

การป้องกันดัดแปลงเมธอด และการป้องกันดัดแปลงเมธอด และสบืทอดคลาส สบืทอดคลาส (final (final methods and classes)methods and classes) การป้องการสบืทอดในคลาสการป้องการสบืทอดในคลาส

– ถ้ามกีารประกาศ ถ้ามกีารประกาศ final final ในคลาสใดๆ แสดงวา่ในคลาสใดๆ แสดงวา่คลาสนัน้ไมส่ามารถนำาไปสบืทอดเป็น คลาสนัน้ไมส่ามารถนำาไปสบืทอดเป็น super super class class ของคลาสอ่ืนได้ของคลาสอ่ืนได้

– ตัวอยา่ง คลาส ตัวอยา่ง คลาส String String ไมส่ามารถนำาไปสบืทอดไมส่ามารถนำาไปสบืทอดสรา้งคลาสยอ่ยใหมไ่ด้ สรา้งคลาสยอ่ยใหมไ่ด้

Page 21: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2121

THE TYPE-WRAPPER CLASSES THE TYPE-WRAPPER CLASSES FOR PRIMITIVE TYPESFOR PRIMITIVE TYPES คลาสตัวหอ่หุม้ชนิดขอ้มูลคลาสตัวหอ่หุม้ชนิดขอ้มูล

– ชนิดขอ้มูลพื้นฐาน ชนิดขอ้มูลพื้นฐาน short, short, int ,long,char,float,double int ,long,char,float,double และ และ booleanboolean

ไมใ่ช ่คลาสไมใ่ช ่คลาส– คลาสเหล่านี้มสีิง่รว่มกันหลายสิง่ เชน่ การแปลงคลาสเหล่านี้มสีิง่รว่มกันหลายสิง่ เชน่ การแปลง

สายอักขระ เป็นตัวเลข สายอักขระ เป็นตัวเลข – เพื่อความสะดวกในการเขยีนโปแกรมเชงิวตัถ ุต้องเพื่อความสะดวกในการเขยีนโปแกรมเชงิวตัถ ุต้อง

มคีลาสมาหอ่หุม้ชนิดขอ้มูลเหล่าน้ีเอาไว้มคีลาสมาหอ่หุม้ชนิดขอ้มูลเหล่าน้ีเอาไว้

Page 22: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2222

THE TYPE-WRAPPER THE TYPE-WRAPPER CLASSES FOR PRIMITIVE CLASSES FOR PRIMITIVE TYPESTYPES

Object

CharBoolean

Byte

Number

Short LongInteger

Double

Float

Page 23: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2323

THE TYPE-WRAPPER THE TYPE-WRAPPER CLASSES FOR PRIMITIVE CLASSES FOR PRIMITIVE TYPESTYPES คลาสตัวหอ่หุม้ชนิดขอ้มูลคลาสตัวหอ่หุม้ชนิดขอ้มูล

– เป็นคลาสแบบ เป็นคลาสแบบ finalfinal ไมส่ามารถนำาไปสบืทอดได้ไมส่ามารถนำาไปสบืทอดได้– สว่นใหญ่มเีมธอดท่ีประกาศเป็น สว่นใหญ่มเีมธอดท่ีประกาศเป็น static static เชน่ เชน่

paseInt paseInt ของ ของ IntegerIntegerint x ;X = Integer.paseInt(10);

double d;d= Double.paseDouble(1345.45);

float f; f = Float.paseFloat(134.50);

Page 24: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2424

การใช ้การใช ้interfacesinterfaces Interface Interface คืออะไรคืออะไร

– การประกาศกลุ่มของเมธอดท่ีคลาสต่างๆ ใชช้ื่อการประกาศกลุ่มของเมธอดท่ีคลาสต่างๆ ใชช้ื่อรว่มกัน สว่นรายละเอียดของเมธอดเหล่านัน้ รว่มกัน สว่นรายละเอียดของเมธอดเหล่านัน้ คลาสท่ีนำาไปใชต้้องเขยีนเอง คลาสท่ีนำาไปใชต้้องเขยีนเอง

– การประกาศ การประกาศ Interface Interface ไมใ่ชก่ารสบืทอดไมใ่ชก่ารสบืทอดโดยตรง เพราะแต่ละโดยตรง เพราะแต่ละเมธอด อาจนำาไปพฒันารายละเอียดแตกต่างกันเมธอด อาจนำาไปพฒันารายละเอียดแตกต่างกันตามคลาสท่ีนำาไปใช ้ไมม่ขีอ้มูลต้องใชร้ว่มกันตามคลาสท่ีนำาไปใช ้ไมม่ขีอ้มูลต้องใชร้ว่มกัน

Page 25: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2525

การใช ้การใช ้interfacesinterfaces วธิสีรา้ง วธิสีรา้ง InterfacesInterfaces

ใชค้ำาสงวน ใชค้ำาสงวน interface interface แทนคลาส ภายในแทนคลาส ภายในบรรจุเมธอดโดยไมต้่องระบุรายละเอียดบรรจุเมธอดโดยไมต้่องระบุรายละเอียด

การนำาไปใช ้การนำาไปใช ้– ใชค้ำาสงวน ใชค้ำาสงวน implements implements ตามด้วยชื่อ ตามด้วยชื่อ

interfaceinterface– เมธอดทกุตัวใน เมธอดทกุตัวใน interface interface ต้องมรีายละเอียด ต้องมรีายละเอียด

{ }{ }

Page 26: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2626

การใช ้การใช ้interfacesinterfaces วธิสีรา้ง วธิสีรา้ง interfaceinterfacepublic interface Shape{

public double getArea(); public double getVolume();

public String getName(); }

public class Circle extends Object implements Shape{ public double r;

public double getArea(){ return Math.PI * r*r; } public double getVolume() { }

public String getName() { return “circle”;}}

Page 27: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2727

ตัวอยา่งการใช ้ตัวอยา่งการใช ้Interface Interface เพื่อลดการเขยีนคำาสัง่เพื่อลดการเขยีนคำาสัง่ ปัญหา สมมุติวา่เราต้องการเขยีนโปรแกรมปัญหา สมมุติวา่เราต้องการเขยีนโปรแกรม

เรยีงขอ้มูล เมธอดเดียวสามารถรองรบัการเรยีงขอ้มูล เมธอดเดียวสามารถรองรบัการเรยีงขอ้มูลได้หลายประเภทสามารถทำาได้ด้วยเรยีงขอ้มูลได้หลายประเภทสามารถทำาได้ด้วยการใช ้การใช ้interface interface

Page 28: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2828

ตัวอยา่งการใช ้ตัวอยา่งการใช ้Interface Interface เพื่อลดการเขยีนคำาสัง่เพื่อลดการเขยีนคำาสัง่

public interface Relation {

public boolean isGreater(Object b);public boolean isLess(Object b);public boolean isEqual(Object b);

}

Relation.java

Page 29: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 2929

import java.text.DecimalFormat;public class Rectangle implements Relation {

private double x; private double y; private double width; private double length; public Rectangle () { } public Rectangle(double x1,double y1, double w,double len ) {

x = x1; y=y1; width = w; length = len; } //end Constructor public double area(){ return width* length;} public boolean isGreater(Object b ) {

return area () > ((Rectangle)b).area(); } public boolean isLess(Object b){

return area () < ((Rectangle)b).area(); } public boolean isEqual(Object b ) {

return area () == ((Rectangle)b).area(); }

Rectangle.java

Continue

Page 30: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3030

public String toString(){String s;DecimalFormat out = new DecimalFormat("0.00");s = "Rectangle (" + out.format(x ) + ", " + out.format(y ) + ") " +

" \twidth = " + out.format(width ) + " \tlength = " + out.format(length ) + " \tarea =" + out.format(area());

return s;}

}//end class

Rectangle.java

Page 31: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3131

import java.text.DecimalFormat;public class Cubic implements Relation {

private double x; private double y; private double width ; private double length; private double height; public Cubic () { } public Cubic(double x1,double y1, double w,double len, double

h) { x = x1; y=y1; width = w; length = len; height = h;

} //end Constructor public double volume(){ return width* length* height;}

public boolean isGreater(Object b ) { return volume () > ((Cubic)b).volume();

} public boolean isLess(Object b){

return volume () < ((Cubic)b).volume(); } public boolean isEqual(Object b ) {

return volume () == ((Cubic)b).volume(); }

Cubic.java

Continue

Page 32: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3232

public String toString(){String s;DecimalFormat out = new DecimalFormat("0.00");s = "Cubic (" + x + ", " + y + ") " +

" \tWidth = " + out.format(width ) + " Length =" + out.format(length ) + " Height =" + out.format(height ) + " \tVolume =" + out.format(volume());

return s;}

}//end class

Cubic.java

Page 33: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3333

คลาสเรยีงขอ้มูลคลาสเรยีงขอ้มูลpublic class SortObject {

public static Object [] sort(Object [] data ) {Object temp;

for(int i = 0 ; i < data.length-1; i++) for(int j = 0; j< data.length-1-i; j ++) {

if ( ( (Relation)data[j]).isGreater ( (Relation)data[j+1 ] ) ){

temp = data[j];data[j ] = data[j+1];data[j+1 ] = temp;

} //end if}return data;

} //end sort} //end class

SortObject.java

Page 34: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3434

public class SortRectangleTest { public static void main(String [] args){ Object rect [] = new Rectangle[4]; //create objects rect[0 ] = new Rectangle(10,0,5,10); rect[1 ] = new Rectangle(10,20,10,15); rect[2 ] = new Rectangle(20,5,5,2); rect[3 ] = new Rectangle(100,20,6,5);

SortObject.sort(rect); System.out.println("Sorted Rectangles by size"); for(int i = 0 ; i < rect.length-1; i ++) {

System.out.println(rect[i].toString () ); } //end for Object c [] = new Cubic[4];

SortRectangleTest.java

Continue

Page 35: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3535

//create objectsc[0 ] = new Cubic(10,0,5,5,5);c[1 ] = new Cubic(10,20,10,15,5);c[2 ] = new Cubic(20,20,5,2,5);c[3 ] = new Cubic(30,20,6,5,5);System.out.println("\nSorted Cubics by volume");SortObject.sort(c);for(int i = 0 ; i < c.length-1; i ++) {

System.out.println(c[i].toString () );} //end for

} //end main method} //end class

SortRectangleTest.java

Page 36: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3636

ผลลัพธ์ผลลัพธ์

Page 37: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3737

ประโยชน์ของ ประโยชน์ของ interfaceinterface การใช ้การใช ้Interface Interface

– คลาสท่ีมกีารประกาศ คลาสท่ีมกีารประกาศ implements implements จากอินเตอร์จากอินเตอร์เฟรส มพีฤติกรรมเกือบเหมอืนคลาสยอ่ยท่ีสบืทอดเฟรส มพีฤติกรรมเกือบเหมอืนคลาสยอ่ยท่ีสบืทอดจากคลาสนามธรรมท่ีมชีื่อ เมธอดนามธรรมเหมอืนกันจากคลาสนามธรรมท่ีมชีื่อ เมธอดนามธรรมเหมอืนกัน

– ทำาไมไมใ่ช ้คลาสนามธรรมแทน ทำาไมไมใ่ช ้คลาสนามธรรมแทน interface interface เลยเลยทัง้หมดละทัง้หมดละ?? เหตผุล ใน เหตผุล ใน Java Java ไมอ่นุญาตใหส้บืทอดหลายคลาสได้พรอ้มไมอ่นุญาตใหส้บืทอดหลายคลาสได้พรอ้ม

กันเหมอืนใน กันเหมอืนใน C++C++ การใช ้การใช ้interface interface สามารถนำามาแก้ปัญหานี้ได้ เพราะคลาสสามารถนำามาแก้ปัญหานี้ได้ เพราะคลาส

ใด สามารถ ใด สามารถ implement implement ได้หลาย ได้หลาย interface interface พรอ้มกัน พรอ้มกัน ทำาใหส้ะดวก และยดืหยุน่ในการใชง้านทำาใหส้ะดวก และยดืหยุน่ในการใชง้าน

Page 38: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3838

การออกแบบคลาสซอ้นคลาส การออกแบบคลาสซอ้นคลาส (Nested Classes)(Nested Classes) คลาซอ้นคลาสคลาซอ้นคลาส

– เป็นคลาสท่ีสามารถประกาศในคลาสอ่ืนได้ ซึ่งเป็นคลาสท่ีสามารถประกาศในคลาสอ่ืนได้ ซึ่งเรยีกคลาสนี้วา่ เรยีกคลาสนี้วา่ nested classesnested classes

– Nested classes Nested classes อาจเป็น อาจเป็น static static – Nested classes Nested classes ท่ีไมเ่ป็น ท่ีไมเ่ป็น static static เรยีกวา่ เรยีกวา่

inner classesinner classes– Inner classes Inner classes ใชม้ากในการเขยีนใชม้ากในการเขยีน

โปรแกรมจดัการกับเหตกุารณ์โปรแกรมจดัการกับเหตกุารณ์

Page 39: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 3939

public class LinkedList {class Node {

String text;Node next; Node () {text = ""; next=null;} Node(String s ) { text = s; next = null;}

};private Node firstNode;LinkedList(){ firstNode = null; }public void add(String s ) {

Node newNode = new Node(s);Node lastNode=null, currentNode;if(firstNode == null) firstNode = newNode;else { currentNode = firstNode;

while(currentNode != null ) { lastNode = currentNode; currentNode = currentNode.next; } //end while if(lastNode != null)

lastNode.next = newNode;} //end

} //end add

LinkedList.java

Page 40: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4040

public String remove(){Node currentNode = firstNode;firstNode = currentNode.next;return currentNode.text;

}public String getAllNode () {

String s="";Node currentNode = firstNode;while (currentNode !=null){

s = s + currentNode.text + "\n";currentNode = currentNode.next;

}return s;

}//end getAllNodepublic boolean isempty(){ return firstNode==null;}

} //end class

LinkedList.java

Page 41: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4141

การนำาคลาส การนำาคลาส LinkedList LinkedList มามาใช้ใช้

public class LinkedListTest {

public static void main(String [] args ){

LinkedList myList = new LinkedList();myList.add("Ant");myList.add("Bison");myList.add("Cat");myList.add("Dolphin");String strOut = myList.getAllNode();System.out.println(strOut);

}} //end class

LinkedListTest.java

Page 42: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4242

ทดสอบตัวเองหลังเรยีนทดสอบตัวเองหลังเรยีน นักศึกษาควรตอบตัวเองวา่ได้รูส้ิง่ต่อไปน้ีหรอืยงันักศึกษาควรตอบตัวเองวา่ได้รูส้ิง่ต่อไปน้ีหรอืยงั1.1. What is inheritance?What is inheritance?2.2. What is polymorphismWhat is polymorphism3.3. What are abstract classes and abstract What are abstract classes and abstract

methods? Why would you wish to use an methods? Why would you wish to use an abstract classes and methods in your program?abstract classes and methods in your program?

4.4. What are the advantages of declaring methods What are the advantages of declaring methods or classes to be final? What are the or classes to be final? What are the disadvantages?disadvantages?

5.5. What is an interface? How do interfaces save What is an interface? How do interfaces save programming effort?programming effort?

Page 43: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4343

การบา้นการบา้นสง่ในชัว่โมงต่อไปสง่ในชัว่โมงต่อไป 1. 1. จงสรา้งคลาส จงสรา้งคลาส Polygon Polygon สบืทอดจากสบืทอดจาก

คลาส คลาส ShapeDrawing ShapeDrawing เพื่อเก็บอะเรยข์อเพื่อเก็บอะเรยข์องอ็อบเจกต์ที่สรา้งจากคลาส งอ็อบเจกต์ที่สรา้งจากคลาส Point Point ซึ่งเก็บซึ่งเก็บจุดโคออรดิ์เนต จุดโคออรดิ์เนต (x,y) (x,y) แล้วเมื่อสัง่เมธอด แล้วเมื่อสัง่เมธอด draw() draw() ของ ของ Polygon Polygon แล้วใหว้าดเสน้ตรงแล้วใหว้าดเสน้ตรงเชื่อมระหวา่งจุดทกุจุด เชื่อมระหวา่งจุดทกุจุด

การทดสอบคลาส การทดสอบคลาส Polygon Polygon ใหส้รา้ง ใหส้รา้ง applet applet เพื่อวาด เพื่อวาด

Page 44: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4444

การบา้นการบา้นสง่ในชัว่โมงต่อไปสง่ในชัว่โมงต่อไป2. 2. จงเขยีนคลาสจงเขยีนคลาส TestPolymorphismTestPolymorphism เป็น เป็น

applet applet เพื่อใหส้รา้งอะเรยข์องคลาส เพื่อใหส้รา้งอะเรยข์องคลาส Object Object เพื่อใหร้องรบัการวาดเพื่อใหร้องรบัการวาดอ็อบเจกต์ท่ีเกิดจากคลาส อ็อบเจกต์ท่ีเกิดจากคลาส Circle, Circle, Rectangle, Rectangle, และ และ Polygon Polygon แล้วสัง่ แล้วสัง่ for(int i=0; i<obj.length;i++)for(int i=0; i<obj.length;i++)((ShapeDrawing)obj[i]).draw(g);((ShapeDrawing)obj[i]).draw(g);

เมื่อ เมื่อ obj obj เป็นตัวแปรอะเรยป์ระเภท เป็นตัวแปรอะเรยป์ระเภท ObjectObject

Page 45: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4545

การบา้นการบา้นสง่ในชัว่โมงต่อไปสง่ในชัว่โมงต่อไป3 .3 . จงใช ้จงใช ้interface interface ชื่อ ชื่อ relation relation เพื่อเพื่อ

เปรยีบเทียบกันระหวา่งคลาส เปรยีบเทียบกันระหวา่งคลาส List List โดยใช้โดยใช้จำานวนโหนดในคลาส จำานวนโหนดในคลาส List List เป็นหลักในการเป็นหลักในการเปรยีบเทียบเปรยีบเทียบ

list1 = {1,2,4,5};list1 = {1,2,4,5}; list2 = {1,3};list2 = {1,3}; แสดงวา่ แสดงวา่ list1 > list2list1 > list2

Page 46: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4646

การบา้นการบา้นสง่ในชัว่โมงต่อไปสง่ในชัว่โมงต่อไป4. 4. จงใชค้ณุสมบติั จงใชค้ณุสมบติั inner class inner class เพื่อสรา้งเพื่อสรา้ง

คลาส คลาส DoublyLinkedList DoublyLinkedList เพื่อจดัการกับเพื่อจดัการกับการเพิม่โหนด ลบโหนด ท่องโหนดของการเพิม่โหนด ลบโหนด ท่องโหนดของโครงสรา้งขอ้มูลแบบ โครงสรา้งขอ้มูลแบบ Doubly Linked Doubly Linked ListList

Page 47: Polymorphism and Interface

http://www.siam2dev.comhttp://www.siam2dev.com 4747