Bài giảng Lập trình hướng đối tượng (OOP) - Chương 4: Kế thừa - Văn Thị Thiên Trang
1. Kế thừa – Inheritance. 2. Phạm vi kế thừa 3. Đối tượng Super 4. Định nghĩa lại phương thức 5. Quan hệ qiữa các lớp 6. Toán tử instanceof 7. Vấn đề ép kiểu trong Java
Bạn đang xem nội dung tài liệu Bài giảng Lập trình hướng đối tượng (OOP) - Chương 4: Kế thừa - Văn Thị Thiên Trang, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chương 4. Kế thừa
1
Chương 4. Kế thừa
1
Mục đích & yêu cầu
Giải thích được:
• Thừa kế là gì trong OOP.
• Các loại thừa kế trong các ngôn ngữ OOP.
Phân biệt được kỹ thuật Overloading và
Overriding.
Sử dụng được toán tử instanceOf và ép kiểu
trong Java
Giải thích được những tình huống có thể xảy
ra khi ép kiểu.
2
Nội dung chính
1. Kế thừa – Inheritance.
ế ừ2. Phạm vi k th a
3. Đối tượng Super
4. Định nghĩa lại phương thức
5 Quan hệ qiữa các lớp.
6. Toán tử instanceof
7. Vấn đề ép kiểu trong Java
3
1. Kế thừa – Khái niệm
Kế thừa cho phép định nghĩa một lớp mới
qua một lớp đã có
Lớp dùng để kế thừa gọi là lớp cha (lớp
cơ sở)
Lớp kế thừa gọi là lớp con (lớp dẫn xuất).
Lớp con có một số thành phần của lớp cha
mà không cần định nghĩa
Lớp con có thể định nghĩa thêm các thành
phần riêng của mình.
4
Chương 4. Kế thừa
2
1. Kế thừa – Ưu điểm
Thừa hưởng data và code từ một hay
nhiều lớp khác.
Kỹ thuật này giúp tái sử dụng code
Î Tiết kiệ ô ứ lậ t ì h ô m c ng s c p r n , c ng
sức kiểm tra code.
5
1. Kế thừa – Phân Loại
Đơn kế thừa
Đa kế thừa (thừa kế bội)
Mỗi ngôn ngữ OOP hỗ trợ khả năng kế
thừa riêng
C++: Đa kế thừa
C#, Java : Đơn kế thừa.
6
1. Kế thừa – Khai báo
Cú pháp:
Ví dụ: lớp SinhVien kế thừa từ lớp ConNguoi
class extends
{
Khai báo các thành phần bổ sung của lớp con
}
class SinhVien extends CONNGUOI
{
.
}
7
150
200
Thí dụ về thừa kế
H
21
P02
Luan
25
150
P03
Quang
25
200
300
100
emp
mng
p
200
300
P01
oa
100
8
Chương 4. Kế thừa
3
2. Phạm vi kế thừa
Lớp con được phép kế thừa các thành
phần của lớp cha với phạm vi:
• public
• protected
Thành phần protected: được phép kế
thừa nhưng không được phép truy
xuất bên ngoài lớp.
9
2. Phạm vi kế thừa
Ví dụ:
class ConNguoi
{
protected String hoTen;
protected int namSinh;
public ConNguoi(){ hoTen=“”; namSinh=1900;}
public ConNguoi(String ht, int ns){ }
public void ganHoTen(String ht){}
bli id N Si h(i t ){ }pu c vo gan am n n ns
public String layHoTen(){}
public String layNamSinh(){}
public void hienThi()
{System.out.print(hoTen+” “ + namSinh);}
} 10
2. Phạm vi kế thừa
class SinhVien extends ConNguoi
{
protected double dtb;
public void ganDtb(double d){}
public double layDtb(){}
public void hienThi(){}
}
Lớp SV có những thành phần nào?
11
3. Đối tượng super
Đối tượng super dùng để truy xuất đến đối tượng
thuộc lớp cha trong phạm vi lớp con.
Sử dụng super:
• Gọi phương thức khởi tạo lớp cha: super()
Gọi phương thức thuộc lớp cha: super.tenPhươngThức()
Lời gọi super() phải được gọi đầu tiên trong PTKT
lớp con (sau khai báo).
Nếu trong lớp con không gọi PTKT của lớp cha thì
tự động gọi PTKT ngầm định của lớp cha.
12
Chương 4. Kế thừa
4
3. Đối tượng super
Ví dụ sử dụng super
class SinhVien extends ConNguoi{
protected double dtb;
public SinhVien() { super(); dtb=0.0;}
public SinhVien(String ht, int ns, double d)
{ super(ht,ns); dtb=d; }
public void ganDtb(double d){}
public double layDtb(){ }
public void hienThi(){}
}
13
4. Định nghĩa lại phương thức
Override: Trong lớp con được phép định
nghĩa lại (sửa code bên trong phương
thức) các phương thức kế thừa từ lớp
cha.
Đối tượng của lớp con sẽ sử dụng
phương thức đã định nghĩa lại.
14
Ví dụ: định nghĩa lại phương thức hienThi() trong
lớp SinhVien:
4. Định nghĩa lại phương thức
class SinhVien extends ConNguoi{
protected double dtb;
public void hienThi()
{
super.hienThi();
System.out.println(“ ” + dtb);
}
}
Sử dụng:
SinhVien sinhVien = new SinhVien(“Ng Van A”,1985,7.5);
sinhVien.hienThi();//gọi phương thức đã được định nghĩa lại.
15
4. Định nghĩa lại phương thức
Khác biệt giữa overloading và overriding:
• Overloading: Kỹ thuật cho phép nhiều hành vi trùng tên
nhưng khác số lượng tham số hoặc kiểu tham số trong
cùng một lớp.
• Overriding: Kỹ thuật cho phép sửa code của một hành
vi mà lớp con thừa kế từ lớp cha để lớp con phản ứng
khác với lớp cha.
16
Chương 4. Kế thừa
5
overloading method:
cùng tên,
khác tham số,
cùng lớp
overriding method:
cùng tên,
cùng tham số,
ở hai lớp cha con
17
Luyện tập
Khai báo lớp SV (theo sơ đồ)
Khai báo các lớp SVSP, SVTH kế thừa
từ lớp SV.
Chương trình:
• Tạo 1 sinh viên SP
• Tạo 1 sinh viên TH
• Hiển thị thông tin của 2 SV trên
18
Sơ đồ các
lớp
SV
#hoTen
#namSinh
#dtb
SV(S i i d bl )+ tr ng, nt, ou e
+hienThi()
SVSP
#noiTT
SVTH
#tenDT
#diemTT
+SVSP(..)
+hienThi()
+duocTN()
#diemDT
+ SVTH()
+ hienThi()
+ duocTN() 19
Cài đặt lớp SV
class SV
{
protected String hoTen;
protected int namSinh;
protected double dtb;
public SV(String ht, int ns, double d)
{hoTen=ht; namSinh=ns; dtb=d;}
public void hienThi()
{
System.out.print(hoTen+” “+namSinh+” “+dtb);
}
}
20
Chương 4. Kế thừa
6
Cài đặt lớp SVSP
21
Cài đặt lớp SVTH
22
5 – Cơ chế liên kết muộn
Tham chiếu của lớp cha có thể tham
h ế đế đố ủ lớc i u n i tượng c a p con.
Ví dụ:
SinhVien s1,s2;
s1 = new SVSP(“Ng V A”,1986,7.5,”Trg A”, 7.0);
s2 = new SVTH(“Le Th B” 1987 7 ”VB” 8 0);, , , , .
s1.hienThi(); ??
s2.hienThi(); ??
23
5. Cơ chế liên kết muộn
Cơ chế liên kết muộn: khi tham chiếu đến
đối tượng thuộc lớp nào thì sử dụng các
thành phần của lớp đó định nghĩa lại từ
lớp cơ sở hoặc được kế thừa từ lớp cha.
Ví dụ: với s1, s2 như trên
s1.hienThi(); // sử dụng lớp SVSP
s2.hienThi(); // sử dụng lớp SVTH
24
Chương 4. Kế thừa
7
5. Cơ chế liên kết muộn
Tham chiếu của lớp cơ sở chỉ sử dụng
được những phương thức định nghĩa lại.
Ví dụ: không thực hiện được
boolean d1 = s1.duocTN();
boolean d2 = s2.duocTN();
Để thực hiện được phải khai báo phương
thức duocTN() ở lớp SV.
25
5. Ứng dụng liên kết muộn
Chương trình quản lý danh sách sinh
viên gồm 2 loại SVSP và SVTH. Thực
hiện các thao tác:
• Tạo lập và lưu trữ danh sách SV.
• Liệt kê danh sách sv.
• Liệt kê danh sách svsp.
• Liệt kê danh sách sv được tốt nghiệp.
26
SV
#hoTen
#namSinh
#dtb
+SV()
DSSV
- ds[]
- soSV
+DSSV(int)
+them(SV)
Sơ đồ các lớp
+hienThi()
SVSP
#noiTT
SVTH
#tenDT
+lietKe()
+lietKe(String)
+dsTN()
+loaiSV()
+duocTN()
#diemTT
+SVSP()
+hienThi()
#diemDT
+SVTH()
+hienThi()
+loaiSV() +loaiSV()
+duocTN() +duocTN()
27
Lớp SV
class SV
{
protected hoTen;
protected namSinh;
protected double dtb;
public SV(String ht, int ns, double d){}
public void hienThi(){ }
public String loaiSV(){ return “”;}
public boolean duocTN() { return true;}
}
28
Chương 4. Kế thừa
8
Lớp SVSP
class SVSP extends SV
{
protected String noiTT;
protected double diemTT;
public SVSP() {}
public void hienThi(){}
public String loaiSV(){ return “SP”;}
public boolean duocTN()
{ return dtb>=5.0 && diemTT>=7.0;}
}
29
Cài đặt lớp DSSV (1)
class DSSV
{
private SV[] ds;
private int soSV;
public DSSV(int n)
{ds = new SV[n];
soSV=0;}
bli id h (SV )pu c vo t em s
{
if (soSV<ds.length) ds[soSV++]=s;
}
30
Cài đặt lớp DSSV (2)
public void lietKe()
{
for(int i=0;i<soSV;i++) ds[i].hienThi();
}
public void lietKe(String loai)
{
for(int i=0;i<soSV;i++)
if (ds[i].loaiSV().equals(loai))
ds[i].hienThi();
}
31
Cài đặt lớp DSSV (3)
public void dsTN()
{
for(int i=0;i<soSV;i++)
if (ds[i].duocTN())
ds[i].hienThi();
}
32
Chương 4. Kế thừa
9
Sử dụng lớp DSSV
class SDDSSV
{
public static void main(String args[])
{DSSV k1=new DSSV(80); SV s;
s = new SVSP(“Nguyen Van A”,1987,7.0,”Truong X”,7.0);
k1.them(s);
s = new SVTH(“Le Thi B”,1987,7.5,”Java”,7.0);
k1.them(s);
k1.lietKe();
k1.lietKe(“SP”);
k1.dsTN();
}
}
33
6. Toán tử instanceof
Toán tử instanceof có 2 toán hạng
Toán hạng trái: Một đối tượng
Toán hạng phải: Tên 1 lớp
Trả trị:
true: Nếu đối tượng thuộc lớp này.
false: nếu đối tượng không thuộc lớp này.
34
7- Quan hệ giữa các lớp
Hai lớp không có quan hệ.
Quan hệ cha con : tính thừa kế (đã
học).
Quan hệ bao gộp: Lớp có thành
phần dữ liệu là thể hiện của 1 lớp
khác.
• Lớp thành phần là lớp bên ngoài.
• Lớp thành phần là lớp bên trong (lớp
nội)
35
Lớp có dữ liệu là một đối tượng của lớp ngoài
Chương trình
xuất hóa đơn
Quan hệ bao gộp
36
Chương 4. Kế thừa
10
Lớp có dữ liệu là một đối tượng của lớp ngoài...
Quan hệ bao gộp
37
Lớp có dữ liệu là một đối tượng của lớp ngoài...
Quan hệ bao gộp
38
7. Lớp nội – Inner/nested
class
Là lớp được khai báo bên trong một
lớp khác.
Lớp trong truy xuất được lớp ngoài.
Lớp ngoài phải có ít nhất một thành
phần là instance của lớp trong và
truy xuất các instance này.
39
Lớp nội – Inner/nested class
Cú pháp:
Lớp ngoài muốn truy cập
Quan hệ bao gộp
class Outter
{ .
class
Inner Lợi ích:
Có hể iế d
lớp trong thì phải định
nghĩa 1 đối tượng lớp trong
( bằng toán tử new )
{
}
}
t v t co e truy
xuất lớp ngoài từ lớp
trong mà không cần
định nghĩa đối tượng
lớp ngoài 40
Chương 4. Kế thừa
11
Lớp nội – Inner/nested class
Lớp nội: Lớp ngoài không thể truy cập trực tiếp
lớp trong
Quan hệ bao gộp
41
Lớp nội – Inner/nested class
Lớp ngoài truy cập truy cập thành phần lớp trong thông
qua đối tượng lớp trong. Lớp trong được dùng thành phần
lớp ngoài
Quan hệ bao gộp
42
Luyện tập
Cần quản lý một danh sách nhân viên của 1 cơ quan gồm 2
loại: Nhân viên biên chế và nhân viên hợp đồng.
Các thông tin chung: họ tên, phòng.
• NVBC: hệ số lương, số năm CT.
• NVHD: lương hợp đồng, Loại HĐ(NH,DH).
Các thao tác trên danh sách nhân viên:
• Tạo lập và lưu các nhân viên
Liệt kê danh sách nhân viên• .
• Liệt kê danh sách nhân viên theo loại: HĐ, BC
• Tính tổng lương toàn bộ nhân viên.
• Liệt kê danh sách nhân viên hợp đồng dài hạn.
43
NV
#hoTen
#phong
+NV()
+hienThi()DSNV
Sơ đồ các lớp
NVBC
#hsLuong
#soNamCT
NVHD
#luong
#loaiHD
- ds[]
- soNV
+DSNV(int)
+them(NV)
+lietKe()
+loaiNV()
+layLuong()
+laNVHDDH()
+NVBC(..)
+hienThi()
+NVHD()
+hienThi()
+lietKe(String)
+tongLuong()
+dsHDDH()
+loaiNV()
+loaiNV()
+layLuong()
+layLuong()
+laNVHDDH()44
Chương 4. Kế thừa
12
Bài tập
Viết chương trình nhập/ xuất một hóa đơn với số lượng mặt
hàng nhập từ bàn phím.
Viết chương trình nhập/ xuất danh sách hóa đơn với số
lượng mặt hàng nhập từ bàn phím.
Viết chương trình minh họa cho thiết kế sau:
ế ìNgười
Tên
NămSinh
HọcViên
điểm1
điểm2
NhânViên
Lương
NgàyNhậnViệc
PBK
NhânViênCLCao
PhòngBanKhoa
MãPBK
TênPBK
NVQuảnLý
Vi t chương tr nh
khởi tạo một số
đối tượng gồm:
3 học viên,
2 giaó viên
3 nhân viên
quản lý.
Xuất thông tin về
các đối tượng
điểm3 TrìnhĐộ
Ngành
NơiĐàoTạo GiáoViên
ThùLaoGD
PhụCâpCV .
45