Chương 4. Kế thừa<br />
Mục đích & yêu cầu<br />
Giải thích được:<br />
• Thừa kế là gì trong OOP<br />
OOP.<br />
• Các loại thừa kế trong các ngôn ngữ OOP.<br />
<br />
Chương 4. Kế thừa<br />
<br />
Phân biệt được kỹ thuật Overloading và<br />
Overriding.<br />
verriding.<br />
Sử dụng được toán tử instanceOf và ép kiểu<br />
trong Java<br />
Giải thích được những tình huống có thể xảy<br />
ra khi ép kiểu.<br />
1<br />
<br />
Nội dung chính<br />
<br />
2<br />
<br />
1. Kế thừa – Khái niệm<br />
<br />
1.<br />
<br />
Kế thừa – Inheritance.<br />
<br />
2.<br />
<br />
Phạm vi kế thừa<br />
ế ừ<br />
<br />
3.<br />
<br />
Đối tượng Super<br />
<br />
Lớp dùng để kế thừa gọi là lớp cha (lớp<br />
cơ sở)<br />
<br />
4.<br />
<br />
Định nghĩa lại phương thức<br />
<br />
Lớp kế thừa gọi là lớp con (lớp dẫn xuất).<br />
<br />
5.<br />
5<br />
<br />
Quan hệ qiữa các lớp<br />
<br />
6.<br />
<br />
Toán tử instanceof<br />
<br />
Lớp con có một số thành phần của lớp cha<br />
mà không cần định nghĩa<br />
<br />
7.<br />
<br />
Vấn đề ép kiểu trong Java<br />
<br />
Kế thừa cho phép định nghĩa một lớp mới<br />
qua một lớp đã có<br />
<br />
Lớp con có thể định nghĩa thêm các thành<br />
phần riêng của mình.<br />
3<br />
<br />
4<br />
<br />
1<br />
<br />
Chương 4. Kế thừa<br />
1. Kế thừa – Ưu điểm<br />
<br />
1. Kế thừa – Phân Loại<br />
<br />
Thừa hưởng data và code từ một hay<br />
g<br />
ộ<br />
y<br />
<br />
Đơn kế thừa<br />
Đa kế thừa (thừa kế bội)<br />
<br />
nhiều lớp khác.<br />
<br />
Mỗi ngôn ngữ OOP hỗ trợ khả năng kế<br />
<br />
Kỹ thuật này giúp tái sử dụng code<br />
<br />
thừa riêng<br />
<br />
Tiết kiệ công sức lậ t ì h công<br />
kiệm ô<br />
ứ lập trình, ô<br />
<br />
C++: Đa kế thừa<br />
<br />
sức kiểm tra code.<br />
<br />
C#, Java : Đơn kế thừa.<br />
5<br />
<br />
6<br />
<br />
Thí dụ về thừa kế<br />
<br />
1. Kế thừa – Khai báo<br />
Cú pháp:<br />
300<br />
<br />
200<br />
<br />
150<br />
25<br />
Luan<br />
P02<br />
<br />
100<br />
<br />
21<br />
Hoa<br />
H<br />
P01<br />
<br />
mng<br />
emp<br />
p<br />
<br />
class extends <br />
{<br />
Khai báo các thành phần bổ sung của lớp con<br />
}<br />
<br />
200<br />
150<br />
25<br />
Quang<br />
P03<br />
<br />
300<br />
200<br />
100<br />
<br />
Ví dụ: lớp SinhVien kế thừa từ lớp ConNguoi<br />
ụ<br />
p<br />
p<br />
g<br />
class SinhVien extends CONNGUOI<br />
{<br />
….<br />
}<br />
7<br />
<br />
8<br />
<br />
2<br />
<br />
Chương 4. Kế thừa<br />
2. Phạm vi kế thừa<br />
<br />
2. Phạm vi kế thừa<br />
<br />
Lớp con được phép kế thừa các thành<br />
phần của lớp cha với phạm vi:<br />
<br />
Ví dụ:<br />
class ConNguoi<br />
{<br />
protected String hoTen;<br />
protected int namSinh;<br />
public ConNguoi(){ hoTen=“”; namSinh=1900;}<br />
public ConNguoi(String ht, int ns){ …}<br />
public void ganHoTen(String ht){…}<br />
public void ganNamSinh(int ns){…}<br />
bli<br />
id<br />
N Si h(i t<br />
){ }<br />
public String layHoTen(){…}<br />
public String layNamSinh(){…}<br />
public void hienThi()<br />
{ System.out.print(hoTen+” “ + namSinh);}<br />
<br />
• public<br />
• protected<br />
<br />
Thành phần p<br />
p<br />
protected: được p p kế<br />
ợ phép<br />
thừa nhưng không được phép truy<br />
xuất bên ngoài lớp.<br />
9<br />
<br />
2. Phạm vi kế thừa<br />
<br />
}<br />
<br />
10<br />
<br />
3. Đối tượng super<br />
Đối tượng super dùng để truy xuất đến đối tượng<br />
thuộc lớp cha trong phạm vi lớp con<br />
con.<br />
<br />
class SinhVien extends ConNguoi<br />
{<br />
<br />
Sử dụng super:<br />
<br />
protected double dtb;<br />
public void ganDtb(double d){…}<br />
<br />
• Gọi phương thức khởi tạo lớp cha: super(…)<br />
<br />
public double layDtb(){…}<br />
<br />
Gọi phương thức thuộc lớp cha: super.tenPhươngThức(…)<br />
<br />
public void hienThi(){…}<br />
<br />
Lời gọi super() phải được gọi đầu tiên trong PTKT<br />
lớp con (sau khai báo).<br />
<br />
}<br />
<br />
Lớp SV có những thành phần nào?<br />
11<br />
<br />
Nếu trong lớp con không gọi PTKT của lớp cha thì<br />
tự động gọi PTKT ngầm định của lớp cha.<br />
12<br />
<br />
3<br />
<br />
Chương 4. Kế thừa<br />
3. Đối tượng super<br />
<br />
4. Định nghĩa lại phương thức<br />
<br />
Ví dụ sử dụng super<br />
<br />
Override:<br />
Override: Trong lớp con được phép định<br />
nghĩa lại (sửa code bên trong phương<br />
thức) các phương thức kế thừa từ lớp<br />
cha.<br />
cha.<br />
<br />
class SinhVien extends ConNguoi{<br />
protected double dtb;<br />
public SinhVien() { super(); dtb=0.0;}<br />
public SinhVien(String ht, int ns, double d)<br />
{ super(ht,ns); dtb=d; }<br />
public void ganDtb(double d){…}<br />
public double layDtb(){ }<br />
layDtb(){…}<br />
public void hienThi(){…}<br />
<br />
Đối tượng của lớp con sẽ sử dụng<br />
ợ g<br />
p<br />
ụ g<br />
phương thức đã định nghĩa lại.<br />
lại.<br />
<br />
}<br />
<br />
13<br />
<br />
14<br />
<br />
4. Định nghĩa lại phương thức<br />
<br />
4. Định nghĩa lại phương thức<br />
<br />
Ví dụ: định nghĩa lại phương thức hienThi() trong<br />
lớp SinhVien:<br />
class SinhVien extends ConNguoi{<br />
<br />
Khác biệt giữa overloading và overriding:<br />
overriding:<br />
• Overloading: Kỹ thuật cho phép nhiều hành vi trùng tên<br />
Overloading:<br />
<br />
protected double dtb;<br />
…<br />
public void hienThi()<br />
{<br />
super.hienThi();<br />
System.out.println(“ ” + dtb);<br />
}<br />
<br />
nhưng khác số lượng tham số hoặc kiểu tham số trong<br />
cùng một lớp.<br />
lớp.<br />
• Overriding: Kỹ thuật cho phép sửa code của một hành<br />
vi mà lớp con thừa kế từ lớp cha để lớp con phản ứng<br />
<br />
}<br />
<br />
Sử dụng:<br />
<br />
khác với lớp cha.<br />
<br />
SinhVien sinhVien = new SinhVien(“Ng Van A”,1985,7.5);<br />
SinhVien(“Ng<br />
sinhVien.hienThi();//gọi phương thức đã được định nghĩa lại.<br />
15<br />
<br />
16<br />
<br />
4<br />
<br />
Chương 4. Kế thừa<br />
Luyện tập<br />
overloading method:<br />
cùng tên,<br />
khác tham số,<br />
cùng lớp<br />
<br />
overriding method:<br />
cùng tên,<br />
cùng tham số,<br />
ở hai lớp cha con<br />
<br />
Khai báo lớp SV (theo sơ đồ)<br />
Khai báo các lớp SVSP, SVTH kế thừa<br />
từ lớp SV.<br />
Chương trình:<br />
• Tạo 1 sinh viên SP<br />
• Tạo 1 sinh viên TH<br />
• Hiển thị thông tin của 2 SV trên<br />
<br />
17<br />
<br />
18<br />
<br />
SV<br />
<br />
Sơ đồ các<br />
lớp<br />
<br />
SVSP<br />
#noiTT<br />
#diemTT<br />
+SVSP(..)<br />
+hienThi()<br />
+duocTN()<br />
<br />
Cài đặt lớp SV<br />
<br />
#hoTen<br />
#namSinh<br />
#dtb<br />
+SV(String,int,double)<br />
SV(S i<br />
i d bl )<br />
+hienThi()<br />
SVTH<br />
#tenDT<br />
#diemDT<br />
+ SVTH(…)<br />
+ hienThi()<br />
+ duocTN()<br />
<br />
class SV<br />
{<br />
protected String hoTen;<br />
protected int namSinh;<br />
protected double dtb;<br />
public SV(String ht, int ns, double d)<br />
{hoTen=ht; namSinh=ns; dtb=d;}<br />
public void hienThi()<br />
{<br />
System.out.print(hoTen+” “+namSinh+” “+dtb);<br />
}<br />
}<br />
<br />
19<br />
<br />
20<br />
<br />
5<br />
<br />