Bài giảng Lập trình hướng đối tượng - Chương 3: Thiết kế và đa hình

pdf 67 trang huongle 5340
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 3: Thiết kế 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:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_3_thiet_ke_va_da.pdf

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

  1. Chapter 3 Thừa kế và đa hình CT176 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
  2. Mục tiêu Chương này nhằm giới thiệu tính thừa kế và tính đa hình trong Java CT176 – Lập trình Hướng đối tượng 2
  3. Nội dung • Thừa kế . Thừa kế là gì? . Thừa kế trong Java . Hàm xây dựng trong thừa kế • Đa hình . Nạp đè phương thức . Đa hình . Ứng dụng của tính đa hình • Lớp trừu tượng & Phương thức trừu tượng • Đa thừa kế (multiple inheritance) • Giao diện (interface) CT176 – Lập trình Hướng đối tượng 3
  4. Thừa kế là gì? CT176 – Lập trình Hướng đối tượng 4
  5.  Thừa kế là gì? Khái quát hóa và chuyên biệt hóa • Một đối tượng trong thực tế thường là một phiên bản chuyên biệt của một đối tượng khác khái quát hơn • Khái niệm “côn trùng” mô tả một loài sinh vật rất chung chung với nhiều đặc tính (không xương sống, 3 cặp chân, ) • Châu chấu và ong vò vẽ là côn trùng: . Chia sẻ chung các đặc điểm của côn trùng . Có một số đặc điểm riêng: o Châu chấu có khả năng nhảy o Ong vò vẽ có kim và khả năng chích ⇒ Châu chấu và ong vò vẻ là hai “phiên bản” đặc biệt của côn trùng CT176 – Lập trình Hướng đối tượng 5
  6.  Thừa kế là gì? Thừa kế và quan hệ là (is-a) • Thừa kế được sử dụng để mô hình hóa mối quan hệ là: (hay thực hiện sự chuyên biệt hóa): . Lớp thừa kế: lớp con (subclass) Thừa kế đơn . Lớp được thừa kế: lớp cha (superclass) • Quan hệ giữa lớp cha và lớp con: “là” . Một con châu chấu “là” một côn trùng Đa thừa kế . Một con ong vò vẽ “là” một côn trùng • Một lớp con là sự chuyên biệt hóa của lớp cha: . Mang tất cả các đặc điểm của lớp cha . Thêm một số đặc điểm đặc trưng riêng • Thừa kế dùng để mở rộng khả năng của một lớp CT176 – Lập trình Hướng đối tượng 6
  7.  Thừa kế là gì? Thừa kế và quan hệ là (is-a) - Không xương sống Côn trùng - Xương ngoài - 1 cặp râu Chứa các thuộc tính và - 2 mắt đơn, 1 cặp mắt kép phương thức chung của các loại côn trùng - Hung hãn - Hiền - Có độc Ong vò vẻ Châu chấu - Chân dài - Có thể bay - Ăn lá - Có thể nhảy Chứa các thuộc tính và phương Chứa các thuộc tính và phương thức chung của ong vò vẻ thức chung của châu chấu CT176 – Lập trình Hướng đối tượng 7
  8.  Thừa kế là gì? Thừa kế và quan hệ là (is-a) • Một điểm màu là một điểm có thêm màu sắc - Tung độ, hoành độ Điểm 2D - Nhập tọa độ Chứa các thuộc tính và - Hiển thị tọa độ phương thức chung của - Thay đổi tọa độ các điểm trong không gian 2D - Màu - Thay đổi màu Điểm màu 2D - Hiển thị màu - Nhập màu sắc Chứa các thuộc tính và phương thức của điểm trong không gian 2D với màu sắc CT176 – Lập trình Hướng đối tượng 9
  9. Thừa kế trong Java CT176 – Lập trình Hướng đối tượng 10
  10.  Thừa kế trong Java Tạo lớp thừa kế • Khai báo: modifier class extends { //subclass members } • Ví dụ: Tạo lớp Student thừa kế từ lớp Person public class Student extends Person { //Các thành phần của lớp Student } CT176 – Lập trình Hướng đối tượng 11
  11.  Thừa kế trong Java Qui tắc trong thừa kế 1. Lớp con thừa kế (có) tất cả các thành phần của lớp cha 2. Lớp con có thể truy xuất các thành phần public và protected của lớp cha 3. Lớp con có thể có thêm các thuộc tính, các phương thức mới 4. Lớp con có thể nạp đè (overriding) các phương thức của lớp cha CT176 – Lập trình Hướng đối tượng 12
  12.  Thừa kế trong Java Ví dụ Diem -x, y: int +Diem() +Diem(x: int, y: int) +set(x: int, y: int): void +hienthi(): void +getX(): int +getY(): int DiemMau -mau: int +getMau(): int +setMau(z: int): void +hienthi(): void CT176 – Lập trình Hướng đối tượng 13
  13.  Thừa kế trong Java Ví dụ class Diem { class DiemMau extends Diem { private int x, y; private int mau; public Diem() { public int getMau() { x = y = 0; return mau; } } public Diem(int x, int y) { public void setMau(int m) { this.x = x; this.y = y; mau = m; } } public int getX() { public void hienthi() { return x; System.out.print("(" + getX() + ", " } + getY() + "), " + mau); public int getY() { return y; } } } public void set(int x, int y) { this.x = x; this.y = y; } public void hienthi() { System.out.print("(" + x + ", " + y + ")"); } } CT176 – Lập trình Hướng đối tượng 14
  14.  Thừa kế trong Java Ví dụ class SDDiemMau{ public static void main(String []args) { d: DiemMau DiemMau d = new DiemMau(); -x, y: int d.set(1, 1); -mau: int d.setMau(0); +Diem() +Diem() System.out.println("d: "); +set (int, int): void d.hienthi(); +hienthi(): void } +getX(): int } +getY(): int +getMau(): double +setMau(): double +hienthi(): void CT176 – Lập trình Hướng đối tượng 15
  15.  Thừa kế trong Java Bài tập Circle -radius: double +Circle() +Circle(radius: double) +getRadius(): double +getArea(): double +setRadius(radius: double): void Cylinder -height: double +getHeight(): double +getVolume(): double +setHeight(height: double): void +getArea(): double CT176 – Lập trình Hướng đối tượng 16
  16.  Thừa kế trong Java Hàm xây dựng trong thừa kế • Khi đối tượng thuộc lớp con được tạo ra: . Hàm xây dựng tượng ứng của lớp con sẽ được gọi . Nếu hàm XD của lớp con không gọi đến hàm XD của lớp cha, hàm XD mặc nhiên của lớp cha sẽ tự động được gọi trước khi hàm XD lớp con được thực hiện d: DiemMau DiemMau d = new DiemMau(); -x, y: 0 -mau: Diem() { x = y = 0; } • Nếu muốn gọi hàm xây dựng của DiemMau() {} lớp cha, ta sử dụng từ khóa super: super([các tham số cho hàm XD của lớp cha]); CT176 – Lập trình Hướng đối tượng 17
  17.  Thừa kế trong Java Hàm xây dựng trong thừa kế public class DiemMau extends Diem { d: DiemMau //các dữ liệu thành viên -x: 1, y: 1 public DiemMau() { -mau: 5 super(); mau = 0; DiemMau(1, 1, 5) { } super(1, 1); mau = 5; public DiemMau(int x, int y , int m) { } super(x, y); mau = m; Diem(int x, int y) { } this.x = x; //các hàm thành viên khác this.y = y; } } public static void main(String []args) { DiemMau d = new DiemMau(1, 1, 5); Hàm xây dựng của lớp cha // phải được gọi đầu tiên } CT176 – Lập trình Hướng đối tượng 18
  18.  Thừa kế trong Java Từ khóa super • Là một tham chiếu đến lớp cha hay các lớp tổ tiên (ancestor) của một lớp • Cho phép các phương thức của lớp con truy xuất đến các thành phần lớp cha: . super([đối số]): truy xuất đến hàm xây dựng lớp cha . super. : truy xuất đến thành viên lớp cha class DiemMau extends Diem { public void hienthi() { super.hienthi(); System.out.print(", " + mau); } gọi hàm hienthi() của lớp Diem // } CT176 – Lập trình Hướng đối tượng 19
  19.  Thừa kế trong Java Bài tập Point -x: int -y: int +Point() +Point(x: int, y: int) +getX(): int +setX(x: int): void +getY(): int +setY(y: int): void Point3D -z: int +Point3D() +Point3D(x: int, y: int, z: int) +getZ(): int +setZ(z: int): void CT176 – Lập trình Hướng đối tượng 20
  20.  Thừa kế trong Java Thành phần protected và final • Thành phần protected: . Có thể được truy xuất bởi các phương thức trong lớp con và các phương thức trong cùng gói (package) . Đây là một hình thức giới hạn truy cập nằm giữa public và private . Về mặt ngữ nghĩa, đây là các thành phần dành cho các lớp con cháu • Thành phần final: . Là các thành phần không được phép nạp đè trong lớp con . Được sử dụng để đảm bảo thành phần này chỉ được sử dụng bởi các lớp con hơn là thay đổi (nạp đè) chúng CT176 – Lập trình Hướng đối tượng 21
  21.  Thừa kế trong Java Lớp java.lang.Object • Java tổ chức các lớp dựa trên cách tiếp cận gốc chung: . Các lớp trong Java tạo thành cây phân cấp, trong đó lớp Object là gốc (root) của cây . Tất cả các lớp trong Java đều là con/cháu của lớp Object . Nếu một lớp không được khai báo thừa kế từ bất kỳ lớp nào, lớp đó mặc nhiên sẽ là lớp con của lớp Object . Một tham chiếu thuộc lớp Object có thể tham chiếu đến đối tượng thuộc bất kỳ lớp nào . Lớp này định nghĩa và cài đặt các phương thức và thuộc tính cơ bản mà một đối tượng bắt buộc phải có trong môi trường thực thi Java (JRE) CT176 – Lập trình Hướng đối tượng 22
  22.  Thừa kế trong Java Lớp java.lang.Object Phương thức Mô tả public boolean So sách hai đối tượng có “bằng” nhau hay không equals(Object obj); public String Trả về chuỗi mô tả cho đối tượng toString(); public final Class Trả về kiểu (lớp) của đối tượng getClass(); public int Trả về mã hash (hash code) của đối tượng hashCode(); protected void Hàm hủy của đối tượng, sẽ được gọi bởi bộ thu hồi rác finalize(); (garbage collector) • Ngoài ra, còn các phương thức cần thiết khác để các đối tượng có thể thực thi trong môi trường đa luồng (multi-threading) CT176 – Lập trình Hướng đối tượng 23
  23.  Thừa kế trong Java Lớp java.lang.Object public class TestObjectClass { public static void main(String []args) { Point p = new Point(); System.out.println("Class of p: " + p.getClass().getName()); System.out.println("p.toString(): " + p.toString()); System.out.println("p.hashCode(): " + p.hashCode()); } } class Point { private int x, y; public Point() { this.x = 0; this.y = 0; } } CT176 – Lập trình Hướng đối tượng 24
  24. Nạp đè hàm & tính đa hình CT176 – Lập trình Hướng đối tượng 25
  25.  Nạp đè hàm và tính đa hình Nạp đè hàm (method overriding) • Lớp con có thể có thành viên (thuộc tính/phương thức) trùng với thành viên của lớp cha • Định nghĩa một hàm thành viên lớp con có chữ ký trùng với hàm thành viên lớp cha gọi là nạp đè hàm . Chữ ký hàm (method signature): bao gồm tên hàm + đối số public void hienthi() { } . Khi một phương thức của lớp cha bị đè, nó sẽ bị “che” đi bởi phương thức của lớp con . Các thành viên final của lớp cha không thể bị nạp đè . Muốn gọi hàm bị che đi ở lớp cha, ta dùng tham chiếu super super.hienthi() (xem ví dụ trong phần từ khóa super) CT176 – Lập trình Hướng đối tượng 26
  26.  Nạp đè hàm và tính đa hình Sự tương thích giữa tham chiếu & đối tượng • Một tham chiếu thuộc lớp cha có thể tham chiếu đến: . Đối tượng thuộc lớp cha . Đối tượng thuộc lớp con • Một tham chiếu thuộc lớp con chỉ có thể tham chiếu đến đối tượng thuộc lớp con Parent p; Parent p = new Parent( ); p = new Child( ); Child c; c = new Child( ); Child c = new Parent( ); CT176 – Lập trình Hướng đối tượng 27
  27.  Nạp đè hàm và tính đa hình Tính đa hình (polymorphism) • Cùng 1 thông điệp nhưng sẽ được xử lý khác nhau tùy vào ngữ cảnh cụ thể • Chỉ được thể hiện khi có sử dụng thừa kế + nạp đè hàm class Animal { Animal a[] = new Animal[3]; public void eat() { System.out.println("Eating "); } a[0] = new Animal(); } a[1] = new Monkey(); a[2] = new BabyDog(); class Monkey extends Animal { public void eat() { for (int i=0; i<3; i++) System.out.println("Eating fruits "); } a[i].eat(); } class BabyDog extends Animal { public void eat() { System.out.println("Drinking milk "); } } CT176 – Lập trình Hướng đối tượng 28
  28.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Liên kết tĩnh và liên kết động • Tính đa hình được thực hiện bởi liên kết động (dynamic binding): . Liên kết giữa lời gọi hàm và định nghĩa hàm sẽ được thực hiện lúc thực thi chương trình (runtime) . Liên kết động chỉ được áp dụng cho các Animal phương thức và thuộc tính bị nạp đè +eat() • Liên kết giữa lời gọi hàm và định nghĩa hàm không bị nạp đè: Monkey BabyDog . Được thực hiện lúc biên dịch . Được gọi là liên kết tĩnh +eat() +eat() (static binding) . Áp dụng cho cả thuộc tính a[i].eat(); CT176 – Lập trình Hướng đối tượng 29
  29.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Liên kết tĩnh và liên kết động class Animal { Animal a[] = new Animal[3]; public static int count = 0; public Animal() { a[0] = new Animal(); count++; a[1] = new Monkey(); } a[2] = new BabyDog(); } for (int i=0; i<3; i++) class Monkey extends Animal { System.out.println(a[i].count); public static int count = 0; public Monkey() { System.out.println(Animal.count); count++; System.out.println(Monkey.count); } System.out.println(BabyDog.count); } class BabyDog extends Animal { Kết quả: 3 public static int count = 0; 3 public BabyDog() { 3 count++; 3 } 1 } 1 CT176 – Lập trình Hướng đối tượng 30
  30.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Ghi nhớ về tính đa hình • Một tham chiếu kiểu lớp cha: . Có thể tham chiếu đến đối tượng của lớp cha và đối tượng của lớp con . Chỉ có thể truy xuất các thành phần của lớp cha • Liên kết động chỉ được áp dụng cho các phương thức và thuộc tính bị ghi đè (overriding) • Không thể nạp đè các thành phần final của lớp cha • Các phương thức bị chồng (overloading) không được áp dụng liên kết động Đa hình Thừa kế + Nạp đè hàm + Liên kết động CT176 – Lập trình Hướng đối tượng 31
  31.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Ứng dụng của tính đa hình • Tách rời giữa “giao diện” (interface) giao diện chung và “cài đặt” (implementation), cho phép nhiều người lập trình cùng tham gia vào giải quyết một vấn đề phức tạp dựa trên một “giao diện” đã định nghĩa sẵn • Cho phép quản lý các đối tượng trong chương trình một cách hiệu quả hơn các cài đặt CT176 – Lập trình Hướng đối tượng 32
  32.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Ứng dụng của tính đa hình public class Shape { private String color; public Shape (String color) { this.color = color; } public Shape () { public void inputValue() { this.color = "Unknown"; Scanner s = new Scanner(System.in); } System.out.println("Choose color: "); this.color = s.nextLine(); } public String toString() { return "color=\"" + color + "\""; } public double getArea() { System.out.println("Shape unknown! Cannot compute area!"); return -1; // error } } CT176 – Lập trình Hướng đối tượng 33
  33.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Ứng dụng của tính đa hình public class Rectangle extends Shape { private int len, width; public Rectangle() { super(); this.len = 0; this.width = 0; } public Rectangle(String color, int len, int width) { super(color); this.len = len; this.width = width; } public String toString() { return "Rectangle (" + len + ", " + width + "), “ + super.toString(); } public void inputValue() { Scanner s = new Scanner(System.in); public double getArea() { super.inputValue(); return len * width; System.out.println("Enter length: "); } this.length = s.nextInt(); System.out.println("Enter width: "); this.width = s.nextInt(); } } CT176 – Lập trình Hướng đối tượng 34
  34.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Ứng dụng của tính đa hình public class Triangle extends Shape { private int base, height; public Triangle(String color, int base, int height) { super(); this.base = 0; this.height = 0; } public Triangle(String color, int base, int height) { super(color); this.base = base; this.height = height; } public String toString() { return "Triangle (" + base + ", " + height + "), " + super.toString(); } public void inputValue() { Scanner s = new Scanner(System.in); public double getArea() { super.inputValue(); return 0.5*base*height; System.out.println("Enter base: "); } this.base = s.nextInt(); System.out.println("Enter height: "); this.height = s.nextInt(); } } CT176 – Lập trình Hướng đối tượng 35
  35.  Nạp đè hàm và tính đa hình ⤷ Tính đa hình Ứng dụng của tính đa hình public class TestShape2 { public static void main(String[] args) { Shape []sList = new Shape[10]; int opt, count = 0; do { Scanner kb = new Scanner(System.in); System.out.print("Choose shape (0: exit, 1: Rect, 2: Triangle): "); opt = kb.nextInt(); if (opt == 1) //rectangle sList[count] = new Rectangle(); else if (opt == 2) //triangle sList[count] = new Triangle(); if (opt == 1 || opt == 2) sList[count++].inputValue(); } while (opt != 0); for (int i=0; i< count; i++) System.out.println(sList[i]); } } CT176 – Lập trình Hướng đối tượng 36
  36. Phương thức trừu tượng & Lớp trừu tượng CT176 – Lập trình Hướng đối tượng 37
  37.  Phương thức trừu tượng & lớp trừu tượng Phương thức trừu tượng • Là phương thức chỉ có khai báo, không có cài đặt • Dùng từ khóa abstract được để khai báo một phương thức là trừu tượng • Các lớp con phải cài đặt các phương thức trừu tượng của lớp cha • Dùng cho các phương thức chưa có định nghĩa cụ thể trong ngữ cảnh của lớp đó • Là một phương pháp để bắt buộc các lớp con phải cài đặt các phương thức theo yêu cầu CT176 – Lập trình Hướng đối tượng 38
  38.  Phương thức trừu tượng & lớp trừu tượng Phương thức trừu tượng public class Shape { //các thành viên khác public abstract double getArea(); //diện tích các loại hình khác //nhau thì khác nhau về cách tính } CT176 – Lập trình Hướng đối tượng 39
  39.  Phương thức trừu tượng & lớp trừu tượng Lớp trừu tượng • Là lớp không thể dùng để tạo đối tượng • Thường được sử dụng để thừa kế (là lớp cha cho các lớp khác) • Lớp trừu tượng thể hiện một dạng “chung chung” hoặc trừu tượng của các lớp dẫn xuất từ đó. • Để khai báo một lớp là trừu tượng, ta thêm từ khóa abstract trước từ khóa class trong khai báo lớp. • Lớp chứa phương thức trừu tượng phải được khai báo là lớp trừu tượng. CT176 – Lập trình Hướng đối tượng 40
  40.  Phương thức trừu tượng & lớp trừu tượng Lớp trừu tượng public class TestShape { public static void main(String[] args) { Shape s1 = new Rectangle("red", 4, 5); System.out.println(s1); System.out.println("Area is " + s1.getArea()); Shape s2 = new Triangle("blue", 4, 5); System.out.println(s2); System.out.println("Area is " + s2.getArea()); // Cannot create instance of an abstract class Shape s3 = new Shape("green"); //Compilation Error!! } } CT176 – Lập trình Hướng đối tượng 41
  41.  Phương thức trừu tượng & lớp trừu tượng Phương thức & lớp trừu tượng • Cung cấp một chuẩn (standard) hay giao diện (interface) cho việc phát triển ứng dụng • Một phương thức trừu tượng không thể được khai báo final hay private . Final: không thể được nạp đè . Private: sự kết hợp này không được phép trong Java. • Nên lập trình dựa vào giao diện, không dựa vào cài đặt . Tạo tham chiếu thuộc lớp cha . Tham chiếu đến thể hiện cụ thể của lớp con . Gọi đến các phương thức được định nghĩa ở lớp cha CT176 – Lập trình Hướng đối tượng 42
  42. Đa thừa kế (multiple inheritance) CT176 – Lập trình Hướng đối tượng 43
  43.  Đa thừa kế (multiple inheritance) Đa thừa kế • Đa thừa kế: . Một lớp con thừa kế từ nhiều lớp cha . Còn được gọi là đa thừa kế cài đặt (multiple inheritance of implementation) • Java không hỗ trợ đa thừa kế: . Tránh xung đột các thuộc tính của các lớp cha (diamond problem) . Đảm bảo tính đơn giản của ngôn ngữ JAVA: A simple, object oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high performance, multithreaded, dynamic language. CT176 – Lập trình Hướng đối tượng 44
  44.  Đa thừa kế (multiple inheritance) Đa thừa kế • Java hỗ trợ đa thừa kế kiểu (multiple inheritance of types): một lớp có thể cài đặt nhiều giao diện //One class implements multiple interfaces public class implements { } • Một lớp có thể vừa thừa kế, vừa cài đặt interface public class extends implements { } CT176 – Lập trình Hướng đối tượng 45
  45.  Đa thừa kế (multiple inheritance) Giả lập đa thừa kế • Dùng hàm mặc nhiên (default method) của giao diện: . Chỉ thừa kế được phương thức . Chỉ được hỗ trợ từ Java 8 public class Button implements Clickable, Accessible { public static void main(String[] args) { Button button = new Button(); button.click(); interface Clickable{ button.access(); default void click(){ } System.out.println("click"); } } } • Lưu ý: phương pháp này interface Accessible{ default void access(){ chỉ thừa kế p/thức, không System.out.println("access"); thừa kế được thuộc tính } } CT176 – Lập trình Hướng đối tượng 46
  46.  Đa thừa kế (multiple inheritance) Giả lập đa thừa kế • Dùng quan hệ composition: . “Không thật” chính xác về mặt ngữ nghĩa: quan hệ thừa kế là quan hệ là, trong khi composition là quan hệ bao gồm . Đây là phương pháp giả lập đa thừa kế được sử dụng rộng rãi . Cho phép thừa kế cả thuộc tính và phương thức CT176 – Lập trình Hướng đối tượng 47
  47.  Đa thừa kế (multiple inheritance) Giả lập đa thừa kế class InterfaceOneImpl implements InterfaceOne { //class properties @Override public String methodA(int a) { // } } class InterfaceTwoImpl implements InterfaceTwo { //class properties @Override interface InterfaceOne { public void methodB(String s) { String methodA(int a); // } } interface InterfaceTwo { } void methodB(String s); } CT176 – Lập trình Hướng đối tượng 48
  48.  Đa thừa kế (multiple inheritance) Giả lập đa thừa kế public class ChildClass implements InterfaceOne, InterfaceTwo { private InterfaceOne one; private InterfaceTwo two; ChildClass(InterfaceOne one, InterfaceTwo two) { this.one = one; this.two = two; } @Override public String methodA(int a) { return one.methodA(a); } @Override public void methodB(String s) { two.methodB(s); } } CT176 – Lập trình Hướng đối tượng 49
  49. Giao diện (interface) CT176 – Lập trình Hướng đối tượng 50
  50.  Giao diện (interface) Giao diện (interface) • Một giao diện có thể xem là một lớp hoàn toàn ảo: tất cả các phương thức đều không được cài đặt • Một giao diện: . Chỉ chứa các khai báo của các phương thức với thuộc tính truy cập public . Hoặc các hằng số tĩnh public (public static final ) . Được khai báo bằng từ khóa interface [public] interface [extends ] { //khai báo của các hằng số (static final ) //khai báo các phương thức } CT176 – Lập trình Hướng đối tượng 51
  51.  Giao diện (interface) Giao diện (interface) • Giao diện đóng vai trò như một “cam kết” (contract): . Giao diện có thể làm được gì (nhưng không chỉ định làm như thế nào) . Qui ước đặt tên: tiếp vị ngữ -able (có khả năng/có thể) • Một lớp có thể cài đặt (implement) các giao diện: . Cài đặt tất cả các phương thức của các giao diện Xác nhận khả năng của lớp có thể làm được gì . Sử dụng từ khóa implements • Không thể tạo đối tượng thuộc một giao diện, nhưng có thể tạo tham chiếu thuộc kiểu giao diện CT176 – Lập trình Hướng đối tượng 52
  52.  Giao diện (interface) Ví dụ public interface Movable { //abstract methods to be implemented //by the subclasses public void moveUp(); public void moveDown(); public void moveLeft(); public void moveRight(); } CT176 – Lập trình Hướng đối tượng 53
  53.  Giao diện (interface) Ví dụ public class MovablePoint implements Movable { private int x, y; //coordinates of the point Kết quả: public MovablePoint(int x, int y) { this.x = x; this.y = y; } public String toString() { return "(" + x + "," + y + ")"; } public void moveUp() { y ; } public class TestMovable { public void moveDown() { public static void main(String[] args) { y++; Movable m1 = new MovablePoint(5, 5); } public void moveLeft() { System.out.println(m1); x ; m1.moveDown(); } System.out.println(m1); public void moveRight() { m1.moveRight(); x++; System.out.println(m1); } } } } CT176 – Lập trình Hướng đối tượng 54
  54.  Giao diện (interface) Phương thức mặc định (default method) • Từ Java 8, các giao diện có thể có các phương thức mặc định: . Là phương thức được cài đặt (có thân hàm) . Cho phép thêm vào giao diện các phương thức mà không làm các lớp đã cài đặt giao diện bị lỗi • Các lớp cài đặt phương thức có thể cài đặt hay không cài đặt các phương thức mặc định: . Không cài đặt: thừa kế phương thức mặc định . Cài đặt: nạp đè phương thức mặc định của giao diện . Không cài đặt, chỉ khai báo: phương thức ảo. • Cú pháp: thêm từ khóa default trước khai báo CT176 – Lập trình Hướng đối tượng 55
  55.  Tổng kết Tổng kết • Tính thừa kế cho phép sử dụng lại mã (reuse code) • Lớp thừa kế được gọi là lớp con, lớp được thừa kế được gọi là lớp cha • Lớp con có tất cả các thành phần của lớp cha . Định nghĩa thêm thuộc tính hoặc phương thức mới . Nạp đè (overriding) hàm của lớp cha • Quan hệ giữa lớp con và lớp cha là quan hệ là (is-a) • Tính đa hình cho phép các loại đối tượng khác nhau ứng xử khác nhau với cùng 1 thông điệp • Đa hình: thừa kế + nạp đè hàm + liên kết động CT176 – Lập trình Hướng đối tượng 56
  56.  Tổng kết Tổng kết • Java không hỗ trợ đa thừa kế (lớp con có hơn 1 lớp cha) • Các kỹ thuật mô phỏng đa thừa kế: . Hàm mặc nhiên (default method) của giao diện . Quan hệ composition (hay delegation) • Giao diện: . Đóng vai trò như một “cam kết” về tính năng của một kiểu . Như là một lớp hoàn toàn ảo: chỉ có khai báo phương thức, không có định nghĩa phương thức và các thuộc tính CT176 – Lập trình Hướng đối tượng 57
  57.  Tổng kết Tổng kết CT176 – Lập trình Hướng đối tượng 58
  58.  Quiz Quiz 1. Which of the following is true about inheritance in Java? a) Private methods are final. b) Protected members are accessible within a package and inherited classes outside the package. c) Protected methods are final. d) We cannot override private methods. e) In Java all classes inherit from the Object class directly or indirectly, the Object class is root of all classes. f) Multiple inheritance is not allowed in Java CT176 – Lập trình Hướng đối tượng 59
  59.  Quiz Quiz 2. Say that there are three classes: Computer, AppleComputer, and IBMComputer. What are the likely relationships between these classes? a) Computer is the superclass, AppleComputer and IBMComputer are subclasses of Computer b) IBMComputer is the superclass, AppleComputer and Computer are subclasses of IBMCompute c) Computer, AppleComputer and IBMComputer are sibling classes d) Computer is a superclass, AppleComputer is a subclasses of Computer, and IBMComputer is a sublclas of AppleComputer CT176 – Lập trình Hướng đối tượng 60
  60.  Quiz Quiz 3. Can an object be a subclass of another object? a) Yes, as long as single inheritance is followed b) No, inheritance is only between classes c) Only when one has been defined in terms of the other d) Yes, when one object is used in the constructor of another. 4. How many objects of a given class can there be in a program? a) One per defined class b) One per constructor definition c) As many as the program needs d) One per main() method CT176 – Lập trình Hướng đối tượng 61
  61.  Quiz Quiz 5. Which of the following is correct syntax for defining a new class Jolt based on the superclass SoftDrink? a) class Coca isa SoftDrink { /*class member */ } b) class Coca implements SoftDrink { /*class member */ } c) class Coca defines SoftDrink { /*class member */ } d) class Coca extends SoftDrink { /*class member */ } 6. What restriction of using the super in a constructor? a) It can only be used in the parent's constructor b) Only one child class can use it c) It must be used in the last statement of the constructor d) It must be used in the first statement of the constructor CT176 – Lập trình Hướng đối tượng 62
  62.  Quiz Quiz 7. Output of following Java Program? class Base { public void show() { System.out.println("Base::show() called"); } } class Derived extends Base { public void show() { System.out.println("Derived::show() called"); } } public class Main { public static void main(String[] args) { Base b = new Derived();; b.show(); } a) Derived::show() called } b) Base::show() called CT176 – Lập trình Hướng đối tượng 63
  63.  Quiz Quiz 8. Output of following Java Program? class Base { final public void show() { System.out.println("Base::show() called"); } } class Derived extends Base { public void show() { System.out.println("Derived::show() called"); } } class Main { public static void main(String[] args) { a) Base::show() called Base b = new Derived();; b) Derived::show() called b.show(); } c) Compiler Error } d) Runtime Error CT176 – Lập trình Hướng đối tượng 64
  64.  Quiz Quiz 9. Output of following Java Program? class Base { public static void show() { System.out.println("Base::show() called"); } } class Derived extends Base { public static void show() { System.out.println("Derived::show() called"); } } class Main { public static void main(String[] args) { Base b = new Derived();; (A) Base::show() called b.show(); (B) Derived::show() called } } (C) Compiler Error CT176 – Lập trình Hướng đối tượng 65
  65.  Quiz Quiz 10. Output of following Java Program? class Main { (A) Base Derived Derived public static void doPrint(Base b) { (B) Base Base Derived b.print(); } (C) Base Derived Base public static void main(String[] args) { (D) Complier Error Base x = new Base(); Base y = new Derived(); Derived z = new Derived(); class Base { doPrint(x); public void print() { doPrint(y); System.out.println("Base"); doPrint(z); } } } } class Derived extends Base { public void print() { System.out.println("Derived"); } } CT176 – Lập trình Hướng đối tượng 66
  66.  Quiz Quiz 11. Output of following Java Program? class Grandparent { public void print() { System.out.println("Grandparent's print()"); } } class Parent extends Grandparent { public void print() { System.out.println("Parent's print()"); } } public class Main { public static void main( class Child extends Parent { String[] args) { public void print() { super.super.print(); Child c = new Child(); System.out.println("Child's print()"); c.print(); } } } } CT176 – Lập trình Hướng đối tượng 67
  67. Question? CT176 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG