Bai06 MotSoKyThuatTrongKeThua PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 33

IT3100

LẬP TRÌNH HƯỚNG


ĐỐI TƯỢNG
Bài 06. Một số kỹ thuật trong kế
thừa
1
Mục tiêu bài học

 Trình bày nguyên lý ghi đè trong kế thừa


 Đơn kế thừa và đa kế thừa
 Giao diện và lớp trừu tượng
 Sử dụng các vấn đề trên với ngôn ngữ lập
trình Java.

2
Nội dung

1. Ghi đè (Redefine/Overriding)
2. Lớp trừu tượng (Abstract class)
3. Đa kế thừa và Giao diện (Interface)

3
1/ GHI ĐÈ (OVERRIDING)

4
1.1 Khái niệm ghi đè
 Lớp con có thể định nghĩa phương thức trùng
tên với phương thức trong lớp cha:
 Nếu phương thức mới chỉ trùng tên và khác chữ ký (số
lượng hay kiểu dữ liệu của đối số)
 Chồng phương thức (Method Overloading) (Bài 04)
 Nếu phương thức mới hoàn toàn giống về giao diện (chữ
ký)
 Định nghĩa lại hoặc ghi đè (Method Redefine/Override)

5
1.1 Khái niệm ghi đè (2)
 Phương thức ghi đè sẽ thay thế hoặc làm rõ hơn
cho phương thức cùng tên trong lớp cha
 Đối tượng của lớp con sẽ hoạt động với phương
thức mới phù hợp với nó

6
class Shape {
protected String name;
Shape(String n) { name = n; }
public float calculateArea() { return 0.0f; }
}
class Circle extends Shape {
private int radius;
Circle(String n, int r){ super(n); radius = r;}
public float calculateArea() {
float area = (float)(3.14*radius*radius);
return area;
}
}
class Square extends Shape {
private int side;
Square(String n, int s) {super(n);side = s;}
public float calculateArea() {
float area = (float) side * side;
return area;
}
}

public class Demo {


public static void main(String[] args) {
Circle c = new Circle("Hinh tron",10);
Square s = new Square("Hinh vuong",15);

System.out.println("Dien tich hinh tron: " + c.calculateArea());


System.out.println("Dien tich hinh vuong: " + s.calculateArea());
} 7
1.2 this và super
 this: tìm kiếm phương thức/thuộc tính trong lớp
hiện tại
 super: tìm kiếm phương thức/thuộc tính trong lớp
cha trực tiếp
 Từ khóa super cho phép tái sử dụng các đoạn mã của lớp
cha trong lớp con
 this và super có thể sử dụng cho các phương
thức/thuộc tính non-static và phương thức khởi
tạo

8
Ví dụ
package abc;
public class Person {
protected String name;
protected int age;
public String getDetail() {
String s = name + "," + age;
return s;
}
}

import abc.Person;
public class Employee extends Person {
double salary;
public String getDetail() {
String s = super.getDetail() + "," + salary;
return s;
}
} Gọi lại các phương thức của lớp cha đã bị ghi đè

9
1.3 Một số quy định khi ghi đè
 Phương thức ghi đè trong lớp con
 Có danh sách tham số giống hệt phương thức kế thừa trong
lớp cha, phải có cùng kiểu trả về với phương thức kế thừa
trong lớp cha
 Không được phép ghi đè:
 Các phương thức hằng (final) trong lớp cha
 Các phương thức static trong lớp cha
 Các phương thức private trong lớp cha
 Các chỉ định truy cập không giới hạn chặt hơn
phương thức trong lớp cha
• Ví dụ, nếu ghi đè một phương thức protected, thì phương thức
mới có thể là protected hoặc public, mà không được là private

10
Ví dụ
class Parent {
public void doSomething() {}
protected int doSomething2() {
private
attempting to use
return 0;
incompatible return type
}
}
class Child extends Parent {
protected void doSomething() {}
public
protected void doSomething2() {}
}

attempting to assign
weaker access privileges

11
2/ LỚP TRỪU TƯỢNG

12
2.1 Lớp trừu tượng
 Các ngôn ngữ lập trình hướng đối tượng cung cấp các cơ
chế kiểu trừu tượng (abstract type)
 Các kiểu trừu tượng có cài đặt không đầy đủ hoặc không có cài đặt
 Nhiệm vụ chính của chúng là giữ vai trò kiểu tổng quát hơn của
một số các kiểu khác
 Xét ví dụ: lớp Shape
 Là một lớp "không rõ ràng",
khó hình dung ra các đối tượng
cụ thể
• Không thể thể hiện hóa
(instantiate – tạo đối tượng
của lớp) trực tiếp

13
2.1 Lớp trừu tượng
 Không thể thể hiện hóa (instantiate – tạo đối
tượng của lớp) trực tiếp
 Thường lớp trừu tượng được dùng để định
nghĩa các "khái niệm chung", đóng vai trò làm
lớp cơ sở cho các lớp "cụ thể" khác
 Chưa đầy đủ, lớp con kế thừa nó sẽ hoàn thiện
nốt.
 Có thể chứa các phương thức trừu tượng (abstract
method): chỉ có chữ ký mà không có cài đặt cụ thể
 Lớp con khi kế thừa phải cài đặt cụ thể cho các phương
thức trừu tượng của lớp cha
 Phương thức trừu tượng không thể khai báo là final hoặc
static.
14
2.2. Cú pháp
abstract class lớp_Cha {
public abstract kieu ten_PT_TT();
...
}

 Nếu một lớp có một hay nhiều phương thức trừu tượng
thì nó phải là lớp trừu tượng
 Lớp con bắt buộc phải ghi đè tất cả các phương thức trừu
tượng của lớp cha
 Nếu không ghi đè các phương thức này thì lớp con cũng
trở thành một lớp trừu tượng => Phương thức trừu tượng
không thể khai báo là final hoặc static

Kết hợp KHÔNG cho phép


Kết hợp cho phép
abstract private
abstract public
abstract static
abstract protected
abstract final

15
Ví dụ
abstract class Shape {
protected String name;
Shape(String n) { name = n; }
public String getName() { return name; }
public abstract float calculateArea();
}
class Circle extends Shape {
private int radius;
Circle(String n, int r){
super(n);
radius = r;
}
public float calculateArea() {
float area = (float) (3.14 * radius * radius);
return area;
}
}
Shape = new Shape(); //Compile error

16
3/ ĐA KẾT THỪA VÀ GIAO DIỆN

17
3.1. Đa kế thừa
 Đơn kế thừa (Single Inheritance)
 Một lớp chỉ được kế thừa từ một lớp khác
 Đa kế thừa (Multiple Inheritance)
 Một lớp có thể kế thừa nhiều lớp khác
A B C

18
3.2. Vấn đề trong Đa kết thừa
 Xung đột tên
 Thừa kế bị lặp (diamond problem)
SomeClass

Animal FlyingThing
+ color + color
Animal FlyingThing
+ getColor () + getColor ()
+ color + color
+ getColor () + getColor ()
Bird
! Bird

Java chỉ hỗ trợ đơn kế thừa


=> Đưa thêm khái niệm Giao diện (Interface)

19
3.3 Giao diện (Interface)

 Interface: đặc tả cho các cách cài đặt/triển khai.


 Interface định nghĩa một "kiểu" chỉ chứa định
nghĩa hằng và phương thức trừu tượng
 Không thể thể hiện hóa (instantiate) trực tiếp
 Interface không cài đặt bất cứ một phương thức
nào nhưng để lại cấu trúc thiết kế trên bất cứ
lớp nào sử dụng nó
 Dùng để cho phép một lớp có thể “kế thừa” (triển
khai, thực thi) nhiều cấu trúc một lúc
 Interface có thể kế thừa từ nhiều interface khác

20
3.3 Giao diện (2)
 Cú pháp giao diện
 Sử dụng từ khóa interface để định nghĩa
 Chỉ được bao gồm:
• Chữ ký các phương thức (method signature)
• Các thuộc tính khai báo hằng (static & final)

 Lớp thực thi giao diện


 Hoặc là lớp trừu tượng (abstract class)
 Hoặc là bắt buộc phải cài đặt chi tiết toàn bộ các phương
thức trong giao diện nếu là lớp thực.

21
Mở rộng
 Khái niệm giao diện trong các phiên bản của Java

JAVA 7 JAVA 8 JAVA 9


• Chữ ký các phương • Chữ ký các phương • Chữ ký các phương
thức (method thức (method thức (method
signature) signature) signature)
• Các thuộc tính khai báo • Các thuộc tính khai báo • Các thuộc tính khai báo
hằng (static & final) hằng (static & final) hằng (static & final)
• Phương thức mặc định • Phương thức mặc định
(default method) (default method)
• Phương thức tĩnh • Phương thức tĩnh
(Static method) (Static method)
• Private methods

22
3.4. Thực thi giao diện
Kế thừa trước rồi mở rộng !
 Cú pháp thực thi trên Java:
 <Lớp con> [extends <Lớp cha>] implements <Danh sách
giao diện>
 <Giao diện con> extends <Giao diện cha>
 Ví dụ:
public interface DoiXung {…}
public interface DiChuyen {…}
public class HinhVuong extends TuGiac
implements DoiXung, DiChuyen {
...
}

23
3.4. Thực thi giao diện
 Nếu GD có các thuộc tính thì chúng đều là public
static final.
 Các phương thức của GD đều là trừu tượng, nghĩa là
không có thân hàm, và đều có modifier là public
abstract.
 Interface không có Constructor.

24
Ví dụ Shape
#name: String #x: int
#y: int
Action

+getName():String +draw(Graphics)
+calculateArea():float +moveTo(Graphics,int
, int)
+erase(Graphics)

Circle
NO !
-radius: float

+calculateArea():float
+draw(Graphics)
+erase(Graphics)

<<interface>>
Shape Actable
#name: String #x:int #y:int
+getName():String +draw(Graphics)
+calculateArea():float +moveTo(Graphics,int, int)
+erase(Graphics)

Circle
-radius:float
+calculateArea():float
+draw(Graphics)
+moveTo(Graphics,int,int)
+erase(Graphics) 25
Ví dụ - Code
import java.awt.Graphics;
abstract class Shape {
protected String name;
protected int x, y;
Shape(String n, int x, int y) {
name = n; this.x = x; this.y = y;
}
public String getName() {
return name;
}
public abstract float calculateArea();
}
interface Actable {
public void draw(Graphics g);
public void moveTo(Graphics g, int x1, int y1);
public void erase(Graphics g);
}

26
class Circle extends Shape implements Actable {
private int radius;
public Circle(String n, int x, int y, int r){
super(n, x, y); radius = r;
}
public float calculateArea() {
float area = (float) (3.14 * radius * radius);
return area;
}
public void draw(Graphics g) {
System out println("Draw circle at ("
+ x + “," + y + ")");
g.drawOval(x-radius,y-radius,2*radius,2*radius);
}
public void moveTo(Graphics g, int x1, int y1){
erase(g); x = x1; y = y1; draw(g);
}
public void erase(Graphics g) {
System out println(“Erase circle at ("
+ x + “," + y + ")");
// paint the region with background color...
}
} 27
3.4 Lớp trừu tượng vs. Giao diện

Lớp trừu trượng Giao diện

 Có thể có các phương thức  Chỉ có thể chứa chữ ký


abstract, có thể chứa các phương thức (danh sách các
phương thức thực phương thức)
 Có thể chứa các phương  Chỉ có thể chứa các phương
thức protected và static thức public mà không có mã
nguồn
 Chỉ có thể chứa các thuộc
 Có thể chứa các thuộc tính
final và non-final tính hằng
 Một lớp chỉ có thể kế thừa  Một lớp có thể thực thi (kế
một lớp trừu tượng thừa) nhiều giao diện

28
3.4 Lớp trừu tượng vs. Giao diện
Lớp trừu trượng Giao diện
 Có thể chứa PT không trừu  Nếu Giao diện chứa nhiều
tượng, với cài đặt mặc định cho phương thức, phải cài đặt lại PT
các lớp con kế thừa ở tất cả các lớp thực thi GD
 Có thể thêm PT không trừu  Nếu thêm một PT vào trong GD,
tượng vào lớp mà không yêu phải cài đặt lại tất cả các lớp
cầu thay đổi các lớp con kế thực thi GD đó
thừa
 GD không đáp ứng được tính
tái sử dụng mã nguồn

29
Tổng kết
 Ghi đè
 Các phương thức ở lớp con có cùng chữ ký và danh sách
tham số với phương thức ở lớp cha, được tạo ra để định
nghĩa lại các hành vi ở lớp con
 Lớp trừu tượng
 Các lớp không được khởi tạo đối tượng, được tạo ra làm lớp
cơ sở cho các lớp con định nghĩa rõ hơn
 Có ít nhất một phương thức trừu tượng
 Giao diện
 Định nghĩa các phương thức mà lớp thực thi phải cài đặt
 Giải quyết vấn đề đa kế thừa

30
Tổng kết
 Khi nào nên cho một lớp là lớp độc lập, lớp con,
lớp trừu tượng, hay nên biến nó thành interface?
 Một lớp nên là lớp độc lập, nghĩa là nó không thừa kế lớp
nào (ngoại trừ Object) nếu nó không thỏa mãn quan hệ IS-A
đối với bất cứ loại nào khác
 Một lớp nên là lớp con nếu cần cho nó làm một phiên bản
chuyên biệt hơn của một lớp khác và cần ghi đè hành vi có
sẵn hoặc bổ sung hành vi mới
 Một lớp nên là lớp cha nếu muốn định nghĩa một khuôn
mẫu cho một nhóm các lớp con, và có mã cài đặt mà tất cả
các lớp con kia có thể sử dụng
• Cho lớp đó làm lớp trừu tượng nếu muốn đảm bảo rằng không ai
được tạo đối tượng thuộc lớp đó
 Dùng một interface nếu muốn định nghĩa một vai trò mà các
lớp khác có thể nhận, bất kể các lớp đó thuộc cây thừa kế
nào

31
Bài tập
NhanVien
# tenNhanVien: String
 Bài 1: Sửa lại lớp NhanVien: # luongCoBan: double

 Viết mã nguồn của lớp # heSoLuong: double


TruongPhong như hình vẽ biết + LUONG_MAX: double
Lương của trưởng phòng = Lương + tangHeSoLuong(double):
boolean
Cơ bản * hệ số lương + phụ cấp
+ tinhLuong(): double
+ inTTin()

TruongPhong
- phuCap: double
- soNamDuongChuc: int
+ tinhLuong(): double
+ inTTin()

32
Bài tập
 Bài 2: Triển khai xây dựng các lớp, giao diện
theo mô tả UML sau (nội dung các PT là in ra 1 dòng chữ
chỉ tên PT)
<<interface>>
Animal CanMove
#name: String +run()
+run() +back(Graphics,int, int)
+getVelocity(Graphics)

<<interface>>
CanEat
Cat
+eat()
#name: String

+getName() <<interface>>
+back(Graphics,int, int)
+getVelocity(Graphics) CanDrink
+ eat() +drink()
+ drink()

33

You might also like