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]
Feb 10, 2016
http://www.siam2dev.comhttp://www.siam2dev.com 11
Polymorphism and Polymorphism and InterfaceInterfaceออ . . นัฐพงศ์ สง่เนียมนัฐพงศ์ สง่เนียมhttp://www.siam2dev.comhttp://[email protected]@hotmail.com
http://www.siam2dev.comhttp://www.siam2dev.com 22
โพลีมอรฟ์ซิมึ โพลีมอรฟ์ซิมึ (Polymorphism)(Polymorphism) ความหมายความหมาย
– โพลีมอรฟ์ซิมึ หมายถึง แนวความคิดในการติดต่อด้วยวธิีโพลีมอรฟ์ซิมึ หมายถึง แนวความคิดในการติดต่อด้วยวธิีเดียวกันกับหลายๆ สิง่ สว่นผลท่ีจะได้รบัอาจแตกต่างกันเดียวกันกับหลายๆ สิง่ สว่นผลท่ีจะได้รบัอาจแตกต่างกัน
เป้าหมายเป้าหมาย– ลดภาระในการจำาคำาสัง่ คำาสัง่เดียวติดต่อได้ทกุท่ี ลดภาระในการจำาคำาสัง่ คำาสัง่เดียวติดต่อได้ทกุท่ี (many (many
form)form)– ลดภาระในการแก้ไขคำาสัง่ภายในเมธอด สามารถเพิม่หรอืลดภาระในการแก้ไขคำาสัง่ภายในเมธอด สามารถเพิม่หรอื
แก้ไขรายละเอียดภายในเมธอดชื่อเดิมได้ แก้ไขรายละเอียดภายในเมธอดชื่อเดิมได้ (override) (override) โดยไมก่ระทบกระเทือนของเดิมโดยไมก่ระทบกระเทือนของเดิม
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() ชื่อเดียว แต่สามารถใชไ้ด้กับชื่อเดียว แต่สามารถใชไ้ด้กับพนักงานทกุประเภท อันนี้ถือวา่เป็นการนำาเอาความสามารถพนักงานทกุประเภท อันนี้ถือวา่เป็นการนำาเอาความสามารถด้านโพลีมอรฟ์ซิมึมาใช้ด้านโพลีมอรฟ์ซิมึมาใช้
http://www.siam2dev.comhttp://www.siam2dev.com 44
ตัวอยา่งโพลีมอรฟ์ซิมึตัวอยา่งโพลีมอรฟ์ซิมึ
Employee
SalariedEmployee HourlyEmployee
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
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
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
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
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
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
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());
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)
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 ไมไ่ด้
สบืทอดจากคลาสนามธรรม
ดัดแปลงใหม่
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
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
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
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
http://www.siam2dev.comhttp://www.siam2dev.com 1818
สรุปการใช ้สรุปการใช ้PolymorphismPolymorphism สรา้งคลาสแมท่ี่บรรจุเมธอดทัง้หมดท่ีจำาเป็นในสรา้งคลาสแมท่ี่บรรจุเมธอดทัง้หมดท่ีจำาเป็นใน
การแก้ปัญหาการแก้ปัญหา– เมธอดใด ท่ีมคีวามเฉพาะตัวตามคลาสลกูท่ีสบืทอดเมธอดใด ท่ีมคีวามเฉพาะตัวตามคลาสลกูท่ีสบืทอด
ไป ต้องประกาศเป็น ไป ต้องประกาศเป็น abstractabstract methodmethod นิยามคลาสลกูที่สบืทอดมา และนำาเอาเมธอดนิยามคลาสลกูที่สบืทอดมา และนำาเอาเมธอด
นามธรรมมาดัดแปลงใหม่นามธรรมมาดัดแปลงใหม่ สรา้ง สรา้ง Object Object จากคลาสลกูต่างๆ และอ้างถึงอ็จากคลาสลกูต่างๆ และอ้างถึงอ็
อบเจกต์เหล่านัน้โดยใชตั้วอ้างอิงจากคลาสแม ่อบเจกต์เหล่านัน้โดยใชตั้วอ้างอิงจากคลาสแม ่(super class references)(super class references)
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
http://www.siam2dev.comhttp://www.siam2dev.com 2020
การป้องกันดัดแปลงเมธอด และการป้องกันดัดแปลงเมธอด และสบืทอดคลาส สบืทอดคลาส (final (final methods and classes)methods and classes) การป้องการสบืทอดในคลาสการป้องการสบืทอดในคลาส
– ถ้ามกีารประกาศ ถ้ามกีารประกาศ final final ในคลาสใดๆ แสดงวา่ในคลาสใดๆ แสดงวา่คลาสนัน้ไมส่ามารถนำาไปสบืทอดเป็น คลาสนัน้ไมส่ามารถนำาไปสบืทอดเป็น super super class class ของคลาสอ่ืนได้ของคลาสอ่ืนได้
– ตัวอยา่ง คลาส ตัวอยา่ง คลาส String String ไมส่ามารถนำาไปสบืทอดไมส่ามารถนำาไปสบืทอดสรา้งคลาสยอ่ยใหมไ่ด้ สรา้งคลาสยอ่ยใหมไ่ด้
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
ไมใ่ช ่คลาสไมใ่ช ่คลาส– คลาสเหล่านี้มสีิง่รว่มกันหลายสิง่ เชน่ การแปลงคลาสเหล่านี้มสีิง่รว่มกันหลายสิง่ เชน่ การแปลง
สายอักขระ เป็นตัวเลข สายอักขระ เป็นตัวเลข – เพื่อความสะดวกในการเขยีนโปแกรมเชงิวตัถ ุต้องเพื่อความสะดวกในการเขยีนโปแกรมเชงิวตัถ ุต้อง
มคีลาสมาหอ่หุม้ชนิดขอ้มูลเหล่าน้ีเอาไว้มคีลาสมาหอ่หุม้ชนิดขอ้มูลเหล่าน้ีเอาไว้
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
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);
http://www.siam2dev.comhttp://www.siam2dev.com 2424
การใช ้การใช ้interfacesinterfaces Interface Interface คืออะไรคืออะไร
– การประกาศกลุ่มของเมธอดท่ีคลาสต่างๆ ใชช้ื่อการประกาศกลุ่มของเมธอดท่ีคลาสต่างๆ ใชช้ื่อรว่มกัน สว่นรายละเอียดของเมธอดเหล่านัน้ รว่มกัน สว่นรายละเอียดของเมธอดเหล่านัน้ คลาสท่ีนำาไปใชต้้องเขยีนเอง คลาสท่ีนำาไปใชต้้องเขยีนเอง
– การประกาศ การประกาศ Interface Interface ไมใ่ชก่ารสบืทอดไมใ่ชก่ารสบืทอดโดยตรง เพราะแต่ละโดยตรง เพราะแต่ละเมธอด อาจนำาไปพฒันารายละเอียดแตกต่างกันเมธอด อาจนำาไปพฒันารายละเอียดแตกต่างกันตามคลาสท่ีนำาไปใช ้ไมม่ขีอ้มูลต้องใชร้ว่มกันตามคลาสท่ีนำาไปใช ้ไมม่ขีอ้มูลต้องใชร้ว่มกัน
http://www.siam2dev.comhttp://www.siam2dev.com 2525
การใช ้การใช ้interfacesinterfaces วธิสีรา้ง วธิสีรา้ง InterfacesInterfaces
ใชค้ำาสงวน ใชค้ำาสงวน interface interface แทนคลาส ภายในแทนคลาส ภายในบรรจุเมธอดโดยไมต้่องระบุรายละเอียดบรรจุเมธอดโดยไมต้่องระบุรายละเอียด
การนำาไปใช ้การนำาไปใช ้– ใชค้ำาสงวน ใชค้ำาสงวน implements implements ตามด้วยชื่อ ตามด้วยชื่อ
interfaceinterface– เมธอดทกุตัวใน เมธอดทกุตัวใน interface 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”;}}
http://www.siam2dev.comhttp://www.siam2dev.com 2727
ตัวอยา่งการใช ้ตัวอยา่งการใช ้Interface Interface เพื่อลดการเขยีนคำาสัง่เพื่อลดการเขยีนคำาสัง่ ปัญหา สมมุติวา่เราต้องการเขยีนโปรแกรมปัญหา สมมุติวา่เราต้องการเขยีนโปรแกรม
เรยีงขอ้มูล เมธอดเดียวสามารถรองรบัการเรยีงขอ้มูล เมธอดเดียวสามารถรองรบัการเรยีงขอ้มูลได้หลายประเภทสามารถทำาได้ด้วยเรยีงขอ้มูลได้หลายประเภทสามารถทำาได้ด้วยการใช ้การใช ้interface 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
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
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
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
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
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
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
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
http://www.siam2dev.comhttp://www.siam2dev.com 3636
ผลลัพธ์ผลลัพธ์
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 พรอ้มกัน พรอ้มกัน ทำาใหส้ะดวก และยดืหยุน่ในการใชง้านทำาใหส้ะดวก และยดืหยุน่ในการใชง้าน
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 ใชม้ากในการเขยีนใชม้ากในการเขยีน
โปรแกรมจดัการกับเหตกุารณ์โปรแกรมจดัการกับเหตกุารณ์
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
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
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
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?
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 เพื่อวาด เพื่อวาด
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
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
http://www.siam2dev.comhttp://www.siam2dev.com 4646
การบา้นการบา้นสง่ในชัว่โมงต่อไปสง่ในชัว่โมงต่อไป4. 4. จงใชค้ณุสมบติั จงใชค้ณุสมบติั inner class inner class เพื่อสรา้งเพื่อสรา้ง
คลาส คลาส DoublyLinkedList DoublyLinkedList เพื่อจดัการกับเพื่อจดัการกับการเพิม่โหนด ลบโหนด ท่องโหนดของการเพิม่โหนด ลบโหนด ท่องโหนดของโครงสรา้งขอ้มูลแบบ โครงสรา้งขอ้มูลแบบ Doubly Linked Doubly Linked ListList
http://www.siam2dev.comhttp://www.siam2dev.com 4747