Bài giảng Lập trình hướng đối tượng - Chương V: Đa hình

ppt 40 trang huongle 4640
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương V: Đa hình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_lap_trinh_huong_doi_tuong_chuong_v_da_hinh.ppt

Nội dung text: Bài giảng Lập trình hướng đối tượng - Chương V: Đa hình

  1. ĐA HÌNH
  2. Nội dung ◼ Đa hình upcasting / downcasting liên kết động ◼ Lớp và phương thức trừu tượng lớp/phương thức trừu tượng template method ◼ Đa kế thừa và giao diện Kế thừa và đa hình 2
  3. Tài liệu tham khảo ◼ Thinking in Java, chapter 7, 8 ◼ Java how to program, chapter 9 ◼ Kế thừa và đa hình 3
  4. Polymorphism (đa hình) là gì ◼ Polymorphism: nhiều hình thức, nhiều kiểu tồn tại ◼ Đa hình trong lập trình đa hình hàm: hàm trùng tên, phân biệt bởi danh sách tham số đa hình đối tượng ◼ nhìn nhận đối tượng theo nhiều kiểu khác nhau ◼ các đối tượng khác nhau giải nghĩa thông điệp theo cách thức khác nhau Kế thừa và đa hình 4
  5. Up casting ◼ Up casting là khả năng nhìn nhận đối tượng thuộc lớp dẫn xuất như là một đối tượng thuộc lớp cơ sở dùng đối tượng của lớp dẫn xuất để truyền tham số dùng đối tượng của lớp dẫn xuất làm thuộc tính Kế thừa và đa hình 5
  6. Person Person p; -name Employee e = new Employee(); -birthday p = (Person) e; +setName() p.setName( ); +setBirthday() p.setSalary( ); // compile error Employee -salary +setSalary() +getDetail() Kế thừa và đa hình 6
  7. String teamInfo(Person p1, Person p2) { return "Leader: " + p1.getName() + "; member: " + p2.getName(); } Employee e1, e2; Manager m1, m2; System.out.println(teamInfo(e1, e2)); teamInfo(m1, m2); teamInfo(m1,e2); Kế thừa và đa hình 7
  8. Đa hình và liên kết động ◼ Khả năng giải nghĩa các thông điệp theo các cách thức khác nhau Person p1 = new Person(); Person p2 = new Employee(); Person p3 = new Manager(); System.out.println(p1.getDetail()); System.out.println(p2.getDetail()); System.out.println(p3.getDetail()); Kế thừa và đa hình 8
  9. class EmployeeList { Employee list[]; public void add(Employee e) { } public void print() { for (int i=0; i<list.length; i++) { System.out.println(list[i].getDetail()); } EmployeeList list = new EmployeeList(); Employee e1; Manager m1; list.add(e1); list.add(m1); list.print(); Kế thừa và đa hình 9
  10. Liên kết tĩnh và liên kết động Static and dynamic binding ◼ Liên kết tĩnh: lời gọi hàm (phương thức) được quyết định khi biên dịch, do đó chỉ có một phiên bản của chương trình con được thực hiện  ưu điểm về tốc độ ◼ Liên kết động: lời gọi phương thức được quyết định khi thực hiện, phiên bản của phương thức phù hợp với đối tượng được gọi  Java mặc định sử dụng liên kết động ◼ liên kết tĩnh: final / private method Kế thừa và đa hình 10
  11. Đa hình: Gọi phương thức trong constructor class Shape { public Shape() { draw(); } public void draw() {} } class Point extends Shape { protected int x, y; public Point(int xx, int yy) { x = xx; y = yy; } public void draw() { System.out.println("(" + x + "," + y + ")"); } } Point p = new Point(10, 10); Kế thừa và đa hình 11
  12. Đa hình: private method class Base { private void f() { System.out.println(”base f()”); } public void show() { f(); } } public class Derived extends Base { private void f() { System.out.println(”derived f()”); } public static void main(String args[]) { Derived d = new Derived(); Base b = d; b.show(); } } Kế thừa và đa hình 12
  13. Down casting Employee e = new Employee(); Person p = e; // up casting Employee ee = (Employee)p; // down casting Manager m = (Manager)ee; // run-time error Person p2 = new Manager(); Employee e2 = (Employee) p2; Kế thừa và đa hình 13
  14. Toán tử instanceof public class Employee extends Person {} public class Student extends Person {} public doSomthing(Person e) { if (e instanceof Employee) { } else if (e instanceof Student) { } else { } } Kế thừa và đa hình 14
  15. Lớp trừu tượng ◼ Chúng ta có thể tạo ra các lớp cơ sở để tái sử dụng mà không cần tạo ra đối tượng thực của lớp các lớp Point, Circle, Rectangle chung nhau khái niệm cùng là hình vẽ Shape ◼ Giải pháp là khái báo lớp trừu tượng không thể tạo đối tượng Kế thừa và đa hình 15
  16. abstract class Shape { protected int x, y; Shape(int xx, int xy) { x = xx; y = yy; } } Shape s1 = new Circle(); Shape s = new Shape(10, 10) // compile error Kế thừa và đa hình 16
  17. class Circle extends Shape { int r; public Circle(int xx, int yy, int rr) { super(xx, yy); r = rr; } } Kế thừa và đa hình 17
  18. Phương thức trừu tượng ◼ Để thống nhất giao diện, có thể khai báo các phương thức tại lớp cơ sở nhưng được cài đặt thực tế tại lớp dẫn xuất các lớp dẫn xuất khác nhau có cách cài đặt khác nhau ◼ Phương thức trừu tượng bắt buộc phải định nghĩa lại tại lớp dẫn xuất Kế thừa và đa hình 18
  19. abstract class Shape { protected int x, y; abstract public void erase(); abstract public void draw(); public void moveTo(int x1, int y1) { } } Kế thừa và đa hình 19
  20. class Circle extends Shape { int r; public Circle(int xx, int yy, int rr) { super(xx, yy); r = rr; draw(); } public void erase() { System.out.println("Erase at (" + x + "," + y + ")"); } public void draw() { System.out.println("Draw at (" + x + "," + y + ")"); } } Kế thừa và đa hình 20
  21. Template method abstract class Shape { protected int x, y; public void moveTo(int x1, int y1) { erase(); x = x1; y = y1; draw(); } abstract public void erase(); abstract public void draw(); } Kế thừa và đa hình 21
  22. Giao diện (Interface) ◼ Interface là mức trừu tượng cao hơn lớp trừu tượng ◼ Chỉ bao gồm phương thức trừu tượng hằng số (static final) mặc định là public ◼ Cú pháp: từ khóa interface và implements Kế thừa và đa hình 22
  23. interface Action { void moveTo(int x, int y); void erase(); void draw(); } class Circle1 implements Action { int x, y, r; Circle1(int xx, int yy, int rr) { } public void erase() { } public void draw() { } public void moveTo(int x1, int y1) { } } Kế thừa và đa hình 23
  24. Lớp trừu tượng cài đặt giao diện abstract class Shape implements Action { protected int x, y; public Shape() { } public Shape(int xx, int yy) { } public void moveTo(int x1, int y1) { erase(); x = x1; y = y1; draw(); } } Kế thừa và đa hình 24
  25. Đa kế thừa ◼ Java không cho phép đa kế thừa từ nhiều lớp cơ sở  đảm bảo tính dễ hiểu  hạn chế xung đột ◼ Có thể cài đặt đồng thời nhiều giao diện Kế thừa và đa hình 25
  26. class ImageBuffer { } class Animation extends ImageBuffer implements Action { public void erase() { } public void draw() { } public void moveTo() { } } Kế thừa và đa hình 26
  27. interface CanFight { void fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } class ActionCharacter { public void fight() { } } Kế thừa và đa hình 27
  28. class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() { } public void fly() { } } public class Adventure { public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x) { x.fight(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // Treat it as a CanFight u(h); // Treat it as a CanSwim v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter } } Kế thừa và đa hình 28
  29. Mở rộng lớp trừu tượng và giao diện interface I1 { } interface I2 { } interface I3 extends I1, I2 { } abstract class A1 { } abstract class A2 extends A1 implements I1, I2 { } Kế thừa và đa hình 29
  30. Xung đột (1) interface I1 { void f(); } interface I2 { int f(int i); } interface I3 { int f(); } class C { public int f() { return 1; } } class C2 implements I1, I2 { public void f() {} public int f(int i) { return 1; } // overloaded } class C3 extends C implements I2 { public int f(int i) { return 1; } // overloaded } Kế thừa và đa hình 30
  31. Xung đột (2) class C4 extends C implements I3 { // Identical, no problem: //public int f() { return 1; } } class C5 extends C implements I1 {} interface I4 extends I1, I3 {} Kế thừa và đa hình 31
  32. Sao chép đối tượng ◼ Có nhu cầu sao chép các đối tượng Sao chép khi truyền tham số để tránh sửa đổi đối tượng gốc ◼ Làm thế nào để sao chép đối tượng mà không biết rõ kiểu (lớp) thực sự của nó? Sử dụng copy constructor? Sử dụng phương thức copy? ◼ Interface Cloneable và phương thức clone() Kế thừa và đa hình 32
  33. Copy constructor class Base { int m; public Base() { m = 0; } public Base(Base b) { m = b.m; } public String print() { return "base class"; } } class Derived extends Base { int n; public Derived() { n = 1; } public Derived(Derived d) { super(d); n = d.n; } public String print() { return "derived class"; } } Kế thừa và đa hình 33
  34. Sao chép sử dụng copy constructor public class TestCopy { static void copy(Derived d) { Derived d1 = new Derived(d); System.out.println(d1.print()); } static void copy2(Base b) { Base b1 = new Base(b); System.out.println(b1.print()); } public static void main(String args[]) { Derived d = new Derived(); copy(d); copy2(d); } } Kế thừa và đa hình 34
  35. Phương thức clone() ◼ Phương thức clone( ): copy đối tượng Shallow copy Deep copy ◼ Chỉ các lớp implement giao diện Cloneable mới có thể clone. ◼ clone( ) được khai báo là protected trong lớp Object Kế thừa và đa hình 35
  36. Ví dụ về phương thức Clone ◼ // Demonstrate the clone() method. class TestClone implements Cloneable { int a; double b; // This method calls Object's clone(). TestClone cloneTest() { try { // call clone in Object. return (TestClone) super.clone(); } catch(CloneNotSupportedException e) { System.out.println("Cloning not allowed."); return this; } } Kế thừa và đa hình 36
  37. Ví dụ về phương thức Clone ◼ class CloneDemo { public static void main(String args[]) { TestClone x1 = new TestClone(); TestClone x2; x1.a = 10; x1.b = 20.98; x2 = x1.cloneTest(); // clone x1 System.out.println("x1: " + x1.a + " " + x1.b); System.out.println("x2: " + x2.a + " " + x2.b); } } Kế thừa và đa hình 37
  38. Bài tập: Stack làm việc với mọi đối tượng ◼ Hãy cài đặt lớp MyStack làm việc được với mọi đối tượng. Kế thừa và đa hình 38
  39. Bài tập ◼ Sử dụng kiến thức về kế thừa và đa hình để thiết kế các lớp sau Các lớp đối tượng hình học cơ sở Point, Circle, Rectange, Lớp Graphics là một hình phức hợp do người dùng định nghĩa (là một tập các hình cơ sở hoặc phức hợp khác) ◼ Yêu cầu: các lớp phải sử dụng giao diện như nhau: move(), draw(), Kế thừa và đa hình 39
  40. Composite design pattern Kế thừa và đa hình 40