Tải bản đầy đủ (.ppt) (27 trang)

Hướng đối tượng toàn tập 9

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (526.63 KB, 27 trang )

1Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Kế thừa
Kế thừa
2
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Nội dung
Nội dung

Khái niệm kế thừa.
Khái niệm kế thừa.

Tầm vực trong kế thừa.
Tầm vực trong kế thừa.

Định nghĩa lại phương thức.
Định nghĩa lại phương thức.

Quan hệ IS-A và HAS-A.
Quan hệ IS-A và HAS-A.

Bài tập.
Bài tập.
3
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Nội dung
Nội dung

Khái niệm kế thừa.
Khái niệm kế thừa.



Tầm vực trong kế thừa.
Tầm vực trong kế thừa.

Định nghĩa lại phương thức.
Định nghĩa lại phương thức.

Quan hệ IS-A và HAS-A.
Quan hệ IS-A và HAS-A.

Bài tập.
Bài tập.
4
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Khái niệm kế thừa
Khái niệm kế thừa

Vấn đề trùng lấp thông tin:
Vấn đề trùng lấp thông tin:

Nhiều lớp có thông tin giống nhau.
Nhiều lớp có thông tin giống nhau.

Có 2 dạng:
Có 2 dạng:

Dạng chia sẻ: A ∩ B ≠ Ø.
Dạng chia sẻ: A ∩ B ≠ Ø.


Dạng mở rộng: B = A +
Dạng mở rộng: B = A +
ε
ε
.
.

Nhược điểm:
Nhược điểm:

Xây dựng tốn kém.
Xây dựng tốn kém.

Dung lượng lưu trữ lớn.
Dung lượng lưu trữ lớn.

Thay đổi phần chung khó khăn.
Thay đổi phần chung khó khăn.
A
x, y, z
a, b, c
A
x, y, z
a, b, c
B
x, y, z
u, v, w
B
x, y, z
u, v, w

A
x, y, z
A
x, y, z
B
x, y, z
a, b, c
B
x, y, z
a, b, c
Giải quyết: tái sử dụng!!
Giải quyết: tái sử dụng!!
5
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Khái niệm kế thừa
Khái niệm kế thừa

Khái niệm kế thừa:
Khái niệm kế thừa:

Định nghĩa lớp mới dựa trên những lớp đã có.
Định nghĩa lớp mới dựa trên những lớp đã có.

Lớp cơ sở:
Lớp cơ sở:
lớp dùng để định nghĩa lớp mới.
lớp dùng để định nghĩa lớp mới.

Lớp kế thừa:

Lớp kế thừa:
lớp được định nghĩa từ lớp đã có.
lớp được định nghĩa từ lớp đã có.

Lớp kế thừa thừa hưởng
Lớp kế thừa thừa hưởng
TẤT CẢ
TẤT CẢ
từ lớp cơ sở.
từ lớp cơ sở.
A
x, y, z
a, b, c
A
x, y, z
a, b, c
B
x, y, z
u, v, w
B
x, y, z
u, v, w
B
x, y, z
a, b, c
B
x, y, z
a, b, c
O
x, y, z

O
x, y, z
A
x, y, z
A
x, y, z
6
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Khái niệm kế thừa
Khái niệm kế thừa

Khai báo trong C++:
Khai báo trong C++:
class <Lớp kế thừa> : <Loại kế thừa> <Lớp cơ sở>
class <Lớp kế thừa> : <Loại kế thừa> <Lớp cơ sở>

Loại kế thừa:
Loại kế thừa:

public, private, protected.
public, private, protected.

Ví dụ:
Ví dụ:
class A : public O
class A : public O
{
{
private:

private:
// Khai báo thuộc tính mới của A.
// Khai báo thuộc tính mới của A.
public:
public:
// Khai báo phương thức mới của A.
// Khai báo phương thức mới của A.
};
};
7
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Khái niệm kế thừa
Khái niệm kế thừa

Ví dụ:
Ví dụ:

Thông tin:
Thông tin:

Họ tên.
Họ tên.

Mức lương.
Mức lương.

Số ngày nghỉ.
Số ngày nghỉ.


Công việc:
Công việc:

Giảng dạy.
Giảng dạy.

Tính lương.
Tính lương.

Thông tin:
Thông tin:

Họ tên.
Họ tên.

Mức lương.
Mức lương.

Số ngày nghỉ.
Số ngày nghỉ.

Lớp chủ nhiệm.
Lớp chủ nhiệm.

Công việc:
Công việc:

Giảng dạy.
Giảng dạy.


Tính lương.
Tính lương.

Sinh hoạt chủ nhiệm.
Sinh hoạt chủ nhiệm.
Giáo viên
Giáo viên
GVCN
GVCN
8
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Khái niệm kế thừa
Khái niệm kế thừa

Ví dụ:
Ví dụ:
class GiaoVien
class GiaoVien
{
{
private:
private:
char
char
*m_sHoTen;
*m_sHoTen;
float
float
m_fMucLuong;

m_fMucLuong;
int
int
m_iSoNgayNghi;
m_iSoNgayNghi;
public:
public:
GiaoVien(char *sHoTen,
GiaoVien(char *sHoTen,
float fMucLuong,
float fMucLuong,
int iSoNgayNghi);
int iSoNgayNghi);
void giangDay();
void giangDay();
float tinhLuong();
float tinhLuong();
};
};
class
class
GVCN
GVCN
: public
: public
GiaoVien
GiaoVien
{
{
private:

private:
char
char
*m_sLopCN;
*m_sLopCN;
public:
public:
GVCN(char *sHoTen,
GVCN(char *sHoTen,
float fMucLuong,
float fMucLuong,
int iSoNgayNghi,
int iSoNgayNghi,
char *sLopCN);
char *sLopCN);
void sinhHoatCN();
void sinhHoatCN();
};
};
Lớp kế thừa
Lớp kế thừa
Lớp cơ sở
Lớp cơ sở
GVCN thừa hưởng TẤT CẢ
thuộc tính và phương thức
của GiaoVien
GVCN thừa hưởng TẤT CẢ
thuộc tính và phương thức
của GiaoVien
9

Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Khái niệm kế thừa
Khái niệm kế thừa

Ví dụ:
Ví dụ:
void main()
void main()
{
{
GiaoVien gv1(“Minh”, 500000, 5);
GiaoVien gv1(“Minh”, 500000, 5);
gv1.giangDay();
gv1.giangDay();
float fLuong1 = gv1.tinhLuong();
float fLuong1 = gv1.tinhLuong();
GVCN gv2(“Hanh”, 700000, 3);
GVCN gv2(“Hanh”, 700000, 3);
gv2.giangDay();
gv2.giangDay();
gv2.sinhHoatCN();
gv2.sinhHoatCN();
float fLuong2 =
float fLuong2 =
gv2.tinhLuong();
gv2.tinhLuong();
}
}
10

Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Nội dung
Nội dung

Khái niệm kế thừa.
Khái niệm kế thừa.

Tầm vực trong kế thừa.
Tầm vực trong kế thừa.

Định nghĩa lại phương thức.
Định nghĩa lại phương thức.

Quan hệ IS-A và HAS-A.
Quan hệ IS-A và HAS-A.

Bài tập.
Bài tập.
11
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Tầm vực trong kế thừa
Tầm vực trong kế thừa

Tầm vực thay đổi thế nào khi kế thừa?
Tầm vực thay đổi thế nào khi kế thừa?
Lớp cơ sở
private:
m_iX

protected:
m_iY
public:
m_iZ
Lớp cơ sở
private:
m_iX
protected:
m_iY
public:
m_iZ
Lớp kế thừa
???:
m_iX
???:
m_iY
???:
m_iZ
Lớp kế thừa
???:
m_iX
???:
m_iY
???:
m_iZ
Kế thừa





Loại kế thừa quyết định!!
Loại kế thừa quyết định!!
12
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Tầm vực trong kế thừa
Tầm vực trong kế thừa

Bảng tầm vực trong kế thừa:
Bảng tầm vực trong kế thừa:
Tầm vực
Tầm vực
Kế thừa
Kế thừa
public
public
Kế thừa
Kế thừa
protected
protected
Kế thừa
Kế thừa
private
private
public
public
public
public
protected
protected

private
private
protected
protected
protected
protected
protected
protected
private
private
private
private
Không thể
Không thể
truy xuất
truy xuất
Không thể
Không thể
truy xuất
truy xuất
Không thể
Không thể
truy xuất
truy xuất
13
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Nội dung
Nội dung


Khái niệm kế thừa.
Khái niệm kế thừa.

Tầm vực trong kế thừa.
Tầm vực trong kế thừa.

Định nghĩa lại phương thức.
Định nghĩa lại phương thức.

Quan hệ IS-A và HAS-A.
Quan hệ IS-A và HAS-A.

Bài tập.
Bài tập.
14
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Định nghĩa lại phương thức
Định nghĩa lại phương thức

Kế thừa một phần:
Kế thừa một phần:

Không kế thừa “máy móc” tất cả.
Không kế thừa “máy móc” tất cả.

Lớp kế thừa có thể thay đổi những gì đã kế thừa!!
Lớp kế thừa có thể thay đổi những gì đã kế thừa!!





Định nghĩa lại phương thức đã kế thừa.
Định nghĩa lại phương thức đã kế thừa.
Lớp kế thừa thừa hưởng TẤT CẢ thuộc tính và
phương thức của lớp cơ sở TRỪ những
phương thức được định nghĩa lại!!
Lớp kế thừa thừa hưởng TẤT CẢ thuộc tính và
phương thức của lớp cơ sở TRỪ những
phương thức được định nghĩa lại!!
15
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Định nghĩa lại phương thức
Định nghĩa lại phương thức

Ví dụ:
Ví dụ:

GVCN kế thừa từ GiaoVien.
GVCN kế thừa từ GiaoVien.

GVCN tính lương khác GiaoVien.
GVCN tính lương khác GiaoVien.

Lương GV = Mức lương – Số ngày nghỉ * 10000.
Lương GV = Mức lương – Số ngày nghỉ * 10000.

Lương GVCN = Lương GV + Phụ cấp 50000.
Lương GVCN = Lương GV + Phụ cấp 50000.





Viết lại phương thức tinhLuong() cho lớp GVCN.
Viết lại phương thức tinhLuong() cho lớp GVCN.
16
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Định nghĩa lại phương thức
Định nghĩa lại phương thức

Ví dụ:
Ví dụ:
class GiaoVien
class GiaoVien
{
{
private:
private:
char
char
*m_sHoTen;
*m_sHoTen;
float
float
m_fMucLuong;
m_fMucLuong;
int
int

m_iSoNgayNghi;
m_iSoNgayNghi;
public:
public:
GiaoVien(char *sHoTen, float fMucLuong, int iSoNgayNghi);
GiaoVien(char *sHoTen, float fMucLuong, int iSoNgayNghi);
void giangDay();
void giangDay();
float tinhLuong()
float tinhLuong()
{
{
return m_fMucLuong – m_iSoNgayNghi * 10000;
return m_fMucLuong – m_iSoNgayNghi * 10000;
}
}
};
};
17
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Định nghĩa lại phương thức
Định nghĩa lại phương thức

Ví dụ:
Ví dụ:
class
class
GVCN
GVCN

: public
: public
GiaoVien
GiaoVien
{
{
private:
private:
char
char
*m_sLopCN;
*m_sLopCN;
public:
public:
GVCN(char *sHoTen,
GVCN(char *sHoTen,
float fMucLuong,
float fMucLuong,
int iSoNgayNghi,
int iSoNgayNghi,
char *sLopCN);
char *sLopCN);
void sinhHoatCN();
void sinhHoatCN();
float tinhLuong()
float tinhLuong()
{
{
return GiaoVien::TinhLuong() + 50000;
return GiaoVien::TinhLuong() + 50000;

}
}
};
};
void main()
void main()
{
{
GiaoVien gv1(“Minh”, 500000, 5);
GiaoVien gv1(“Minh”, 500000, 5);
gv1.giangDay();
gv1.giangDay();
float fLuong1 = gv1.tinhLuong();
float fLuong1 = gv1.tinhLuong();
GVCN gv2(“Hanh”, 700000, 3);
GVCN gv2(“Hanh”, 700000, 3);
gv2.giangDay();
gv2.giangDay();
float fLuong2 =
float fLuong2 =
gv2.tinhLuong();
gv2.tinhLuong();
}
}
18
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Nội dung
Nội dung


Khái niệm kế thừa.
Khái niệm kế thừa.

Tầm vực trong kế thừa.
Tầm vực trong kế thừa.

Định nghĩa lại phương thức.
Định nghĩa lại phương thức.

Quan hệ IS-A và HAS-A.
Quan hệ IS-A và HAS-A.

Bài tập.
Bài tập.
19
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Quan hệ IS-A và HAS-A
Quan hệ IS-A và HAS-A

Quan hệ IS-A:
Quan hệ IS-A:

Lớp A quan hệ IS-A với lớp B
Lớp A quan hệ IS-A với lớp B

A là một trường hợp đặc biệt của B.
A là một trường hợp đặc biệt của B.

A cùng loại với B.

A cùng loại với B.

Ví dụ:
Ví dụ:

GVCN là một GiaoVien đặc biệt.
GVCN là một GiaoVien đặc biệt.

HinhVuong là một HinhChuNhat đặc biệt.
HinhVuong là một HinhChuNhat đặc biệt.

ConMeo là một ConVat đặc biệt.
ConMeo là một ConVat đặc biệt.
20
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Quan hệ IS-A và HAS-A
Quan hệ IS-A và HAS-A

Quan hệ HAS-A:
Quan hệ HAS-A:

Lớp A quan hệ HAS-A với lớp B
Lớp A quan hệ HAS-A với lớp B

A bao hàm B.
A bao hàm B.

A chứa B.
A chứa B.


B là một bộ phận của A.
B là một bộ phận của A.

Ví dụ:
Ví dụ:

ChiecXe chứa BanhXe.
ChiecXe chứa BanhXe.

QuyenSach chứa TrangSach.
QuyenSach chứa TrangSach.
21
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Quan hệ IS-A và HAS-A
Quan hệ IS-A và HAS-A

Dr. Guru khuyên:
Dr. Guru khuyên:
luật xây dựng lớp.
luật xây dựng lớp.

A có quan hệ IS-A với B.
A có quan hệ IS-A với B.




Cho A kế thừa B.

Cho A kế thừa B.

A có quan hệ HAS-A với B.
A có quan hệ HAS-A với B.




Cho B là một thuộc tính của A.
Cho B là một thuộc tính của A.

Ví dụ:
Ví dụ:
class ConMeo : public ConVat { };
class ConMeo : public ConVat { };
class ChiecXe
class ChiecXe
{
{
private:
private:
BanhXe *m_pBanhXe;
BanhXe *m_pBanhXe;
};
};
22
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Tóm tắt
Tóm tắt


Khái niệm kế thừa:
Khái niệm kế thừa:

Định nghĩa lớp mới dựa trên những lớp đã có.
Định nghĩa lớp mới dựa trên những lớp đã có.

Lớp kế thừa thừa hưởng tất cả từ lớp cơ sở.
Lớp kế thừa thừa hưởng tất cả từ lớp cơ sở.

Tầm vực trong kế thừa:
Tầm vực trong kế thừa:

Tầm vực thay đổi tùy theo loại kế thừa.
Tầm vực thay đổi tùy theo loại kế thừa.

Định nghĩa lại phương thức:
Định nghĩa lại phương thức:

Thay đổi những phương thức kế thừa từ lớp cơ sở.
Thay đổi những phương thức kế thừa từ lớp cơ sở.

Quan hệ IS-A và HAS-A:
Quan hệ IS-A và HAS-A:

IS-A: A là trường hợp đặc biệt của B => A kế thừa B.
IS-A: A là trường hợp đặc biệt của B => A kế thừa B.

HAS-A: A bao hàm B => B là thuộc tính của A.
HAS-A: A bao hàm B => B là thuộc tính của A.

23
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Nội dung
Nội dung

Khái niệm kế thừa.
Khái niệm kế thừa.

Tầm vực trong kế thừa.
Tầm vực trong kế thừa.

Định nghĩa lại phương thức.
Định nghĩa lại phương thức.

Quan hệ IS-A và HAS-A.
Quan hệ IS-A và HAS-A.

Bài tập.
Bài tập.
24
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Bài tập
Bài tập

Bài tập 9.1:
Bài tập 9.1:
Những cặp đối tượng sau có quan hệ IS-A hay HAS-A?
Những cặp đối tượng sau có quan hệ IS-A hay HAS-A?

Khai báo lớp cho từng cặp thể hiện quan hệ giữa chúng.
Khai báo lớp cho từng cặp thể hiện quan hệ giữa chúng.
- Hình vuông / Hình chữ nhật.
- Hình vuông / Hình chữ nhật.
- Đa giác / Cạnh.
- Đa giác / Cạnh.
- Giám đốc / Nhân viên.
- Giám đốc / Nhân viên.
- Hình tròn / Hình Ellipse.
- Hình tròn / Hình Ellipse.
- Máy bay / Động cơ.
- Máy bay / Động cơ.
- Câu / Từ.
- Câu / Từ.
- Mỹ phẩm / Hàng hóa.
- Mỹ phẩm / Hàng hóa.
- Cây lúa / Cây lương thực.
- Cây lúa / Cây lương thực.
- Thư viện / Sách.
- Thư viện / Sách.
- Phim hoạt hình / Phim ảnh.
- Phim hoạt hình / Phim ảnh.
25
Phương pháp lập trình hướng đối tượng – GV. Nguyễn
Minh Huy
Bài tập
Bài tập

Bài tập 9.2:
Bài tập 9.2:

Cho lớp TaiKhoan:
Cho lớp TaiKhoan:
class TaiKhoan
class TaiKhoan
{
{
private:
private:
float
float
m_fSoDu = 0;
m_fSoDu = 0;
public:
public:
float baoSoDu() { return m_fSoDu; }
float baoSoDu() { return m_fSoDu; }
void napTien(float fSoTien) { m_fSoDu += fSoTien; }
void napTien(float fSoTien) { m_fSoDu += fSoTien; }
void rutTien(float fSoTien)
void rutTien(float fSoTien)
{
{
if (fSoTien <= m_fSoDu)
if (fSoTien <= m_fSoDu)
m_fSoDu -= fSoTien;
m_fSoDu -= fSoTien;
}
}
};
};

×