Reusing Classes Classes Inheritance ppt Outline Inheritance Composition

  • Slides: 76
Download presentation
Reusing Classes 重複運用 Classes <<Inheritance. ppt>>

Reusing Classes 重複運用 Classes <<Inheritance. ppt>>

Outline 重複使用類別的方式 Inheritance (繼承) Composition (複合) 初嚐重構 (Refacotring) 的滋味 UML diagrams 簡介向上轉型 (upcasting) Adaptor

Outline 重複使用類別的方式 Inheritance (繼承) Composition (複合) 初嚐重構 (Refacotring) 的滋味 UML diagrams 簡介向上轉型 (upcasting) Adaptor Pattern 2

繼承 語法 實際用途 Method Overriding (函式覆載) 再探 Constructor super 關鍵字 protected 關鍵字 final 關鍵字

繼承 語法 實際用途 Method Overriding (函式覆載) 再探 Constructor super 關鍵字 protected 關鍵字 final 關鍵字 4

用途一 、重複運用程式碼 // Mean. java public class Mean { public int cal. Num(int upper)

用途一 、重複運用程式碼 // Mean. java public class Mean { public int cal. Num(int upper) { int sum = 0, result = 0; for (int i = 1; i <= upper; i++) sum += i; result = sum / upper; return result; } } 6

用途一 (Cont. ) // Range. Mean. java public class Range. Mean extends Mean {

用途一 (Cont. ) // Range. Mean. java public class Range. Mean extends Mean { public int cal. Num(int lower, int upper) { int result = 0; int lower. Sum = lower * cal. Num(lower - 1); int upper. Sum = upper * cal. Num(upper); result = (upper. Sum – lower. Sum) / (upper – lower + 1); return result; } } 7

用途一 (Cont. ) // Main. java public class Main { public static void main(String[]

用途一 (Cont. ) // Main. java public class Main { public static void main(String[] args) { Range. Mean rm = new Range. Mean(); int mean. Of. One. To. Ten = rm. cal. Num(10); // 5. 5 // Mean. cal. Num() int mean. Of. Five. To. Ten = rm. cal. Num(5, 10); // 6. 5 // Range. Mean. cal. Num() } } 子類別可以定義 overload 方法,去擴充父類別的 method。 8

用途二、程式碼修改具獨立性 // Mean. java public class Mean { public int cal. Num(int upper) {

用途二、程式碼修改具獨立性 // Mean. java public class Mean { public int cal. Num(int upper) { int sum = 0, result = 0; for (int i = 1; i <= upper; i++) sum += i; result = sum / upper; return result; } } 9

用途二、修改之後 // Mean. java (改版後) public class Mean { public int cal. Num(int upper)

用途二、修改之後 // Mean. java (改版後) public class Mean { public int cal. Num(int upper) { int sum = 0, result = 0; sum = (1 + upper) * upper / 2 result = (sum / upper) return result; } } 10

Overriding 圖示 class Animal eat() sleep() reproduce( ) class Mammal 覆寫 reproduce( ) class

Overriding 圖示 class Animal eat() sleep() reproduce( ) class Mammal 覆寫 reproduce( ) class Cat 覆寫 sleep() hunt. Mice() purr() Cat Simon eat() reproduce( ) sleep() hunt. Mice() purr() 12

用途三、修改父類別 // Mean. java 無原始碼的情況下! public class Mean { public int cal. Num(int upper)

用途三、修改父類別 // Mean. java 無原始碼的情況下! public class Mean { public int cal. Num(int upper) { int sum = 0, result = 0; for (int i = 1; i <= upper; i++) sum += i; result = sum / upper; return result; } } 13

用途三 (cont. ) // Efficient. Mean. java public class Efficient. Mean extends Mean{ public

用途三 (cont. ) // Efficient. Mean. java public class Efficient. Mean extends Mean{ public int cal. Num(int upper) { int sum = 0, result = 0; Method Override! sum = (1 + upper) * upper / 2; result = sum / upper; return result; } } 14

用途三 (cont. ) // Main. java public class Main { public static void main(String[]

用途三 (cont. ) // Main. java public class Main { public static void main(String[] args) { Mean m = new Mean(); int mean. Of. One. To. Ten = m. cal. Num(10); // 5. 5 // Mean. cal. Num() } } 15

用途三 (cont. ) // Main. java (微微修正後) public class Main { public static void

用途三 (cont. ) // Main. java (微微修正後) public class Main { public static void main(String[] args) { Mean m = new Efficient. Mean(); int mean. Of. One. To. Ten = m. cal. Num(10); // 5. 5 // Range. Mean. cal. Num() } } 多型 (polymorphism) 的展現 16

this() 的使用時機 // Worker. java public class Worker { private String name; private int

this() 的使用時機 // Worker. java public class Worker { private String name; private int salary; public Worker(String name) { this(name, 25000); } public Worker(String name, int salary) { this. name = name; this. salary = salary; } // other mothods. . . } 18

範例 // Main. java public class Main { public static void main(String[] args){ Worker

範例 // Main. java public class Main { public static void main(String[] args){ Worker Peter = new Worker(“Peter”); // Peter’s salary is $25, 000. Worker Sunny = new Worker(“Sunny”, 100); // Sunny’s salary is $100. } } 19

範例 // Person. java public class Person { private String name; public Person(String name)

範例 // Person. java public class Person { private String name; public Person(String name) { this. name = name; } // other mothods. . . } 21

範例 (Cont. ) // Doctor. java public class Doctor extends Person{ private int woking.

範例 (Cont. ) // Doctor. java public class Doctor extends Person{ private int woking. ID; public Person(String name, int id) { super(name); woking. ID = id; } // other mothods. . . } 22

範例 // Drawing. java class Drawing { public Drawing() { print(“Drawing()”); } protected void

範例 // Drawing. java class Drawing { public Drawing() { print(“Drawing()”); } protected void print(String message) { System. out. println(message); } } 25

範例 (Cont. ) // Cartoon. java public class Cartoon extends Drawing { public Cartoon()

範例 (Cont. ) // Cartoon. java public class Cartoon extends Drawing { public Cartoon() { print(“Cartoon()”); } public static void main(String[] args) { Cartoon x = new Cartoon(); } % java Cartoon } Drawing() Cartoon() % 26

final 關鍵字 Final data Final method Final class Final 於重構 (refactoring) 上的應用 28

final 關鍵字 Final data Final method Final class Final 於重構 (refactoring) 上的應用 28

範例 // Final. Data. java public class Final. Data { // Can be compile-time

範例 // Final. Data. java public class Final. Data { // Can be compile-time constants final int i = 9; // Typical public constant public static final int MY_AGE = 27; // Is run-time constant final int j = (int) (Math. random() * 20); } 31

範例 (final arguments) // Final. Arguments. java public class Final. Arguments { void with(final

範例 (final arguments) // Final. Arguments. java public class Final. Arguments { void with(final String s) { s = new String(); // compile error! } void g(final int i) { i++; // compile error! } } 33

Refactoring Replace Magic Number with Symbolic Constant double potential. Energy(double mass, double height) {

Refactoring Replace Magic Number with Symbolic Constant double potential. Energy(double mass, double height) { return mass * 9. 81 * height; // 位能 = mgh } double potential. Energy(double mass, double height) { return mass * GRAVITATIONAL_CONSTANT * height; } static final double GRAVITATIONAL_CONSTANT = 9. 81; 34

Refactoring (重構) 78 refactorings Extract Method Extract Subclass Move Field Move Method Push Up

Refactoring (重構) 78 refactorings Extract Method Extract Subclass Move Field Move Method Push Up Field … 35

語法 public final void f () { // … } 37

語法 public final void f () { // … } 37

語法 & 實例 // IAm. Final. Class. java public final class IAm. Final. Class

語法 & 實例 // IAm. Final. Class. java public final class IAm. Final. Class { // … } public final class String extends Object implements Serializable, Comparable, Char. Sequence 39

範例 // Stack. java import java. util. Vector; public class Stack { private Vector

範例 // Stack. java import java. util. Vector; public class Stack { private Vector elements = new Vector(); public void push(Object obj) { elements. add(obj); } public Object pop() { return elements. remove(size() - 1); } } 41

繼承的陷阱 // My. Hash. Set. java public class My. Hash. Set extends Hash. Set

繼承的陷阱 // My. Hash. Set. java public class My. Hash. Set extends Hash. Set { private int add. Count = 0; public My. Hash. Set() { } public My. Hash. Set(Collection c) { super(c); } public My. Hash. Set(int init. Cap, float load. Factor) { super(init. Cap, load. Factor); } // continue… 45

繼承的陷阱(Cont. ) public boolean add(Object o) { add. Count++; return super. add(o); } public

繼承的陷阱(Cont. ) public boolean add(Object o) { add. Count++; return super. add(o); } public boolean add. All(Collection c) { add. Count += c. size(); return super. add. All(c); } public int get. Add. Count() { return add. Count; } } 46

繼承的陷阱(Cont. ) My. Hash. Set s = new My. Hash. Set(); s. add. All(Arrays.

繼承的陷阱(Cont. ) My. Hash. Set s = new My. Hash. Set(); s. add. All(Arrays. as. List(new String[] {“a”, “b”, “c”})); System. out. println(s. get. Add. Count); // 6! 原因出在 Hash. Set 的 add. All() 暗中呼叫了 add(),卻沒有在 document 中交代清楚。這並不 奇怪,因為 Hash. Set 的設計並不是用來衍生出子類 別的。 47

UML 中 aggregation 表示法 飛機場 0. . 30 飛機 50

UML 中 aggregation 表示法 飛機場 0. . 30 飛機 50

UML Distilled 9 basic diagram Use case diagram Class diagram Object diagram Sequence diagram

UML Distilled 9 basic diagram Use case diagram Class diagram Object diagram Sequence diagram Collaboration diagram Component diagram State diagram Activity diagram Deployment diagram 51

範例 (upcasting) // Driver. java class Display. Driver { public void play. Movie(Movie m)

範例 (upcasting) // Driver. java class Display. Driver { public void play. Movie(Movie m) { //… } } class Matrox extends Display. Driver{ public void play. Movie(Movie m) { //… } } class ATI extends Display. Driver { public void play. Movie(Movie m) { //… } } 53

範例 (Cont. ) // Media. Player. java public class Media. Player { private Display.

範例 (Cont. ) // Media. Player. java public class Media. Player { private Display. Driver driver; public Media. Player(Display. Driver d) { driver = d; } public void show. Movie() { // 準備 Movie m d. play. Movie(m); } // cont… 54

範例 (Cont. ) // Media. Player. java (cont…) public static void main(String[] args) {

範例 (Cont. ) // Media. Player. java (cont…) public static void main(String[] args) { Matrox matrox = new Matrox(); ATI ati = new ATI(); Media. Player m 1 = new Media. Player(matrox); Media. Player m 2 = new Media. Player(ati); } } // end class 這是一個向上轉型的動作 55

Adaptor Pattern 56

Adaptor Pattern 56

起因 * Drawing. Editor Shape bounding. Box create. Manipul Text. View Get. Extent Line

起因 * Drawing. Editor Shape bounding. Box create. Manipul Text. View Get. Extent Line bounding. Box create. Manipul Text bounding. Box create. Manipul 58

解決方式(UML 圖示) * Drawing. Editor Shape bounding. Box create. Manipul Text. View Get. Extent

解決方式(UML 圖示) * Drawing. Editor Shape bounding. Box create. Manipul Text. View Get. Extent Line bounding. Box create. Manipul Text text bounding. Box create. Manipul return text. get. Extent() 60

類別圖(繼承) Main Uses <<interface>> implement Print print. Weak print. Strong Print. Banner print. Weak

類別圖(繼承) Main Uses <<interface>> implement Print print. Weak print. Strong Print. Banner print. Weak print. Strong extends Banner show. With. Paren show. With. Aster 63

Banner 類別 // Banner. java public class Banner { private String string; public Banner(String

Banner 類別 // Banner. java public class Banner { private String string; public Banner(String s) { string = s; } public void show. With. Paren() { System. out. println(“(” + string + “)”); } public void show. With. Aster() { System. out. println(“*” + string + “*”); } } 64

Print 介面 // Print. java public interface Print { public abstract void print. Weak();

Print 介面 // Print. java public interface Print { public abstract void print. Weak(); public abstract void print. Strong(); } 65

Print. Banner 類別 // Print. Banner. java public class Print. Banner extends Banner implements

Print. Banner 類別 // Print. Banner. java public class Print. Banner extends Banner implements Print { public Print. Banner(String s) { super(string); } public void print. Weak() { show. With. Paren(); } public void print. Strong() { show. With. Aster(); } } 66

Main 類別 // Main. java public class Main { public static void main(String[] args)

Main 類別 // Main. java public class Main { public static void main(String[] args) { Print p = new Print. Banner(“Hello”); p. print. Weak(); p. print. Strong(); } } % java Main (Hello) *Hello* 67

類別圖(委讓) Main Uses <<interface>> implement Print print. Weak print. Strong contains Print. Banner print.

類別圖(委讓) Main Uses <<interface>> implement Print print. Weak print. Strong contains Print. Banner print. Weak print. Strong Banner show. With. Paren show. With. Aster 69

Print. Banner 類別 // Print. Banner. java public class Print. Banner implements Print {

Print. Banner 類別 // Print. Banner. java public class Print. Banner implements Print { private Banner b; public Print. Banner(String s) { b = new Banner(string); } public void print. Weak() { b. show. With. Paren(); } public void print. Strong() { b. show. With. Aster(); } } 70

Main 類別 // Main. java public class Main { public static void main(String[] args)

Main 類別 // Main. java public class Main { public static void main(String[] args) { Print p = new Print. Banner(“Hello”); p. print. Weak(); 這是一個向上轉型的動作 p. print. Strong(); } } % java Main (Hello) *Hello* 71

Design Patterns 23 patterns Factory method Adaptor Bridge Iterator Observer Template method … 72

Design Patterns 23 patterns Factory method Adaptor Bridge Iterator Observer Template method … 72

Refactoring 重新組織你的程式碼 <<Inheritance. ppt>>

Refactoring 重新組織你的程式碼 <<Inheritance. ppt>>

再探 Main 類別 // Main. java public class Main { public static void main(String[]

再探 Main 類別 // Main. java public class Main { public static void main(String[] args) { Print p = new Print. Banner(“Hello”); p. print. Weak(); p. print. Strong(); } } Print p = new Print. Banner(“Hello”); 如果上面這段敘述出現很多次,將來想要用新的 Print 子類別取代 Print. Banner 就會出現困擾! 74

重構 Replace Creation with Factory Method Print p = new Print. Banner(“Hello”); Print p

重構 Replace Creation with Factory Method Print p = new Print. Banner(“Hello”); Print p = create. Print(); Print create. Print() { //… } 75

重構後的結果 // Main. java public class Main { public static void main(String[] args) {

重構後的結果 // Main. java public class Main { public static void main(String[] args) { Print p = create. Print(); p. print. Weak(); p. print. Strong(); } private static Print create. Print() { return new Print. Banner(“Hello”); } } 76