Presentation is loading. Please wait.

Presentation is loading. Please wait.

> Polymorphism. Polymorphism - 2 多型的功能 多型提供了「介面與實作分離」的一個重 要性,能將 what (是什麼)自 how (怎麼 做)之中抽離。 多型( polymorphism )除去型別之間的耦 合關係。

Similar presentations


Presentation on theme: "> Polymorphism. Polymorphism - 2 多型的功能 多型提供了「介面與實作分離」的一個重 要性,能將 what (是什麼)自 how (怎麼 做)之中抽離。 多型( polymorphism )除去型別之間的耦 合關係。"— Presentation transcript:

1 > Polymorphism

2 Polymorphism - 2 多型的功能 多型提供了「介面與實作分離」的一個重 要性,能將 what (是什麼)自 how (怎麼 做)之中抽離。 多型( polymorphism )除去型別之間的耦 合關係。

3 Polymorphism - 3 向上轉型( Upcasting ) 「將某個 object reference 視為一個 reference to base type 」的動作,稱為「向 上轉型( upcasting )」。

4 Polymorphism - 4 // Department.java class Person { public void print() { System.out.println(“Person.”); } } class Instructor extends Person { public void print() { System.out.println(“Instructor.”); } class Student extends Person { public void print() { System.out.println(“Student.”); } } public class Department { public static void describe(Person p) { // 不變的事物 p.print(); } public static void main(String[] args) { Instructor i = new Instructor(); Student s = new Student(); // Upcasting describe(i); // Instructor. describe(s); // Student. }

5 Polymorphism - 5 // Department2.java class Person { public void print() { System.out.println(“Person.”); } } class Instructor extends Person { public void print(){ System.out.println(“Instructor.”); } class Student extends Person { public void print() { System.out.println(“Student.”); } } public class Department2 { public static void describe(Person p) { p.print(); } public static void describe(Instructor i) { i.print(); } public static void describe(Student p) { p.print(); } public static void main(String[] args) { Instructor i = new Instructor(); Student s = new Student(); // No upcasting describe(i); // Instructor. describe(s); // Student. }

6 Polymorphism - 6 // dir:X.java package dir; public class X { public void print() { printHeader(); printName(); printFooter(); } private void printHeader() { System.out.println("==="); } private void printFooter() { System.out.println("***"); } protected void printName() { System.out.println(" X "); } // dir:Y.java package dir; public class Y extends X { protected void printName() { System.out.println(" Y "); } // Main.java public class Main { public static void main( String[] args) { // Upcasting X x = new Y(); x.print(); } === Y *** 執行結果:

7 Polymorphism - 7 Method-call 繫結方式 所謂「繫結( binding )」,就是建立 method call 和 method body 的關聯。 Java 函式透過後期繫結達到多型性。 後期繫結( late binding ):繫結動作在執行期根據 object 的型別而進行。後期繫結也被稱為執行期繫結 ( run-time binding )或動態繫結( dynamic binding )。 後期繫結,必須具備「得以在執行期判知 object 型別」 並「呼叫其相應之 methods 」的機制。

8 Polymorphism - 8 final Method Call Java 的所有 methods ,除了被宣告為 final 者,皆使用後期繫結。 為什麼會想將某個 method 宣告為 final 呢? 防止其他人覆寫該 method 。 「關閉」動態繫結,告訴編譯器:動態繫結是 不需要的。

9 Polymorphism - 9

10 Polymorphism - 10 // Shapes.java // Polymorphism in Java. import java.util.*; class Shape { void draw() {} } class Circle extends Shape { void draw() { System.out.println("Circle.draw()"); } } class Square extends Shape { void draw() { System.out.println("Square.draw()"); } } class Triangle extends Shape { void draw() { System.out.println("Triangle.draw()"); } // 接下頁

11 Polymorphism - 11 // A "factory" that randomly creates shapes: class RandomShapeGenerator { private Random rand = new Random(); public Shape next() { switch(rand.nextInt(3)) { default: case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); } // 接下頁

12 Polymorphism - 12 public class Shapes { private static RandomShapeGenerator gen = new RandomShapeGenerator(); public static void main(String[] args) { Shape[] s = new Shape[9]; // Fill up the array with shapes: for (int i = 0; i < s.length; i++) s[i] = gen.next(); // Make polymorphic method calls: for (int i = 0; i < s.length; i++) s[i].draw(); } } ///:~

13 Polymorphism - 13 Abstract Classes 和 Abstract Methods 所謂 abstract class 是一種本身不能被具 現化 (instantiated) 的 class ,但允許為其內 宣告的函式提供實作碼。 如果你打算宣告一個 class 卻只提供部分實 作, abstract class 就可以一顯身手。

14 Polymorphism - 14 Abstract Classes 和 Abstract Methods (cont.) abstract class 中未曾實作的函式,稱為 abstract methods 。 任何一個「擴展 ( 繼承 ) abstract class 」的 derived class ,如果希望被視為 concrete class , 必須實作 abstract class 中的所有 abstract 函式。 如果某個 class 擴展 ( 繼承 ) 了某個 abstract class ,但未能提供所有 abstract 函式的實作 碼,那麼它依然是個 abstract class 。

15 Polymorphism - 15 abstract class TeamScores { private Team team; public abstract int player1Score(int holeNumber, Team team); public abstract int player1Score(int holeNumber, Team team); public abstract void store TeamScore(int score, Team team); // 接下頁

16 Polymorphism - 16 public void processBetterBallTeamScores( Team team) { int teamScore = 0; for (int i = 1; i <= 18; i++){ int p1Score = player1Score(i, team); int p1Score = player2Score(i, team); if (p1Score < p2Score) teamScore = p1Score; else teamScore = p2Score; storeTeamScore(teamScore, team); }

17 Polymorphism - 17 class Result extends TeamScores { public int player1Score(int holeNum, Team team){ int score; // score = lookup holeNum score for player1 on // given team return score; } public int player2Score(int holeNum, Team team){ int score; // score = lookup holeNum score for player2 on // given team return score; } public void storeTeamScore(int score, Team team){ // Store score for team }


Download ppt "> Polymorphism. Polymorphism - 2 多型的功能 多型提供了「介面與實作分離」的一個重 要性,能將 what (是什麼)自 how (怎麼 做)之中抽離。 多型( polymorphism )除去型別之間的耦 合關係。"

Similar presentations


Ads by Google