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

Thừa kế lập trình hướng đối tượng

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 (708.04 KB, 80 trang )

Lập trình hướng đối tượng – Thừa kế
1
Chương 3
THỪA KẾ
THỪA KẾ
Lập trình hướng đối tượng – Thừa kế
2
Nội dung chính

Tại sao phải thừa kế ?
Tại sao phải thừa kế ?

Các thuật ngữ
Các thuật ngữ

Thừa kế trong C++
Thừa kế trong C++

Phạm vi truy cập trong các kiểu thừa kế
Phạm vi truy cập trong các kiểu thừa kế

Đơn thừa kế và đa thừa kế
Đơn thừa kế và đa thừa kế

Sự tương hợp kiểu giữa lớp cơ sở và lớp dẫn xuất
Sự tương hợp kiểu giữa lớp cơ sở và lớp dẫn xuất

Định nghĩa các hàm thành viên cho các lớp dẫn
Định nghĩa các hàm thành viên cho các lớp dẫn
xuất
xuất





Lập trình hướng đối tượng – Thừa kế
3
Tài liệu đọc
Lập trình hướng đối tượng – Thừa kế
4
Tại sao phải thừa kế ?
L pớ
L pớ
Các đ i t ngố ượ
Tính dùng l i b ng th a kạ ằ ừ ế
Làm th nào đ xây d ng l p m i: Bàn làm vi c và Bàn ăn t i?ế ể ự ớ ớ ệ ố
class dining table
class desk
Bàn và Ghế
Lập trình hướng đối tượng – Thừa kế
5
Xây dựng lớp mới từ lớp đã có
Furniture
Table
Lounge
Chair
Sofa
Dining
Table
Desk
Chair
class dining table: public table

class desk: public table
class table: public furniture
Lập trình hướng đối tượng – Thừa kế
6
Một ví dụ khác (1)
Rectangle
Triangle
Polygon
class Polygon
class Polygon
{
{
private:
private:


int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);
}
}
class Rectangle{
class Rectangle{
private:
private:



int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);


int area();
int area();
}
}
class Triangle{
class Triangle{
private:
private:


int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);



int area();
int area();
}
}
Lập trình hướng đối tượng – Thừa kế
7
Một ví dụ khác (2)
Rectangle
Triangle
Polygon
class Polygon
class Polygon
{
{
protected:
protected:


int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);
}
}

class Rectangle : public Polygon
class Rectangle : public Polygon
{
{
public:
public:


int area();
int area();
}
}
class Rectangle{
class Rectangle{
protected:
protected:


int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);


int area();
int area();

}
}
Lập trình hướng đối tượng – Thừa kế
8
Một ví dụ khác (3)
Rectangle
Triangle
Polygon
class Polygon
class Polygon
{
{
protected:
protected:


int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);
}
}
class Triangle : public Polygon
class Triangle : public Polygon
{
{

public: int area();
public: int area();
}
}
class Triangle{
class Triangle{
protected:
protected:


int width, length;
int width, length;
public:
public:


void set(int w, int l);
void set(int w, int l);


int area();
int area();
}
}
Lập trình hướng đối tượng – Thừa kế
9
Thừa kế để

Tạo ra mối quan hệ phân cấp giữa các lớp
Tạo ra mối quan hệ phân cấp giữa các lớp


Khả năng dùng lại phần mềm

Phát triển (mở rộng) các lớp đã có mà không cần
Phát triển (mở rộng) các lớp đã có mà không cần
phải sửa hoặc biên dịch lại chúng
phải sửa hoặc biên dịch lại chúng

Có thể dùng lại code, do đó tiết kiệm thời gian

Giảm lỗi vì không cần biên dịch lại những lớp đã
Giảm lỗi vì không cần biên dịch lại những lớp đã



Che giấu thông tin
Che giấu thông tin

Các lớp mới không cần biết bên trong các phương
thức của lớp đã có

Nhưng nó vẫn có thể sử dụng chúng

Có thể mở rộng code đã có (không cần viết lại)
Có thể mở rộng code đã có (không cần viết lại)
Lập trình hướng đối tượng – Thừa kế
10
Các thuật ngữ

Lớp cơ sở (trong C++)/Lớp cha (trong Java)

Lớp cơ sở (trong C++)/Lớp cha (trong Java)

Lớp đã có mà các lớp mới có thể thừa kế từ nó

Lớp dẫn xuất (trong C++)/Lớp con (trong Java)
Lớp dẫn xuất (trong C++)/Lớp con (trong Java)

Lớp mới được tạo ra bằng thừa kế từ lớp đã có

Lớp cơ sở được gọi là tổng quát hóa của lớp dẫn
Lớp cơ sở được gọi là tổng quát hóa của lớp dẫn
xuất
xuất

Lớp dẫn xuất được gọi là chuyên biệt hóa của lớp
Lớp dẫn xuất được gọi là chuyên biệt hóa của lớp
cơ sở
cơ sở

Một lớp dẫn xuất có thể là lớp cơ sở của các lớp
Một lớp dẫn xuất có thể là lớp cơ sở của các lớp
dẫn xuất khác: hình thành phân cấp lớp
dẫn xuất khác: hình thành phân cấp lớp
Lập trình hướng đối tượng – Thừa kế
11
Các thuật ngữ (tt)

Lớp cơ sở trực tiếp: là lớp cơ sở mà từ nó một
Lớp cơ sở trực tiếp: là lớp cơ sở mà từ nó một
lớp dẫn xuất được thừa kế một cách tường minh

lớp dẫn xuất được thừa kế một cách tường minh

Lớp cơ sở gián tiếp: là lớp được thừa kế từ 2
Lớp cơ sở gián tiếp: là lớp được thừa kế từ 2
hoặc nhiều mức phía trên trong phân cấp lớp
hoặc nhiều mức phía trên trong phân cấp lớp

Đơn thừa kế: một lớp được dẫn xuất từ một lớp
Đơn thừa kế: một lớp được dẫn xuất từ một lớp
cơ sở (trong Java chỉ có đơn thừa kế)
cơ sở (trong Java chỉ có đơn thừa kế)

Đa thừa kế: cho phép một lớp có thể được thừa
Đa thừa kế: cho phép một lớp có thể được thừa
kế từ nhiều lớp (trong C++ cho phép đơn thừa
kế từ nhiều lớp (trong C++ cho phép đơn thừa
kế và đa thừa kế)
kế và đa thừa kế)
Lập trình hướng đối tượng – Thừa kế
12
Ví dụ: Lớp cơ sở, lớp dẫn xuất, …
Single
inheritance
CommunityMember
Employee Student
Administrator Teacher
AdministratorTeacher
StaffFaculty
Alumnus
Single

inheritance
Single
inheritance
Multiple
inheritance
Lập trình hướng đối tượng – Thừa kế
13
Biểu diễn thừa kế bằng UML
Person
Name: String
Address: Address
DOB: Date
Student
Student Number: Integer
Program: ProgramCode
Staff
Staff Number: Integer
StartDate: Date
Faculty: FacultyCode
Classification: Integer
Permanent
AnnualSalary: Money
AccruedLeave: Integer
Casual
PayRate: Money
ContractHours: Integer
ContractEnd: Date
Lập trình hướng đối tượng – Thừa kế
14
Phân biệt mối quan hệ is-a và has-a


Is-a hoặc a kind of: thừa kế
Is-a hoặc a kind of: thừa kế

Lớp dẫn xuất là một lớp cơ sở

Car is a Vehicle

Has-a: chứa/có
Has-a: chứa/có

Lớp có một thành viên

Car has a Engine
Lập trình hướng đối tượng – Thừa kế
15
Ví dụ: is-a/a kind of
Các l p c sớ ơ ở
- t ng quátổ
- ít thành viên
- kích th c i ướ đố
t ng nh h nượ ỏ ơ
Các l p d n xu tớ ẫ ấ
- c thụ ể
- nhi u thành viên ề
h nơ
- kích th c i ướ đố
t ng l n h nượ ớ ơ
class Telephone
class SpeakerTelephone

class WirelessTelephone
class VoiceMailTelephone
class SpeakerRedialTelephone
Inheritance is called
“is-a” relationship.
(ng c v i “has-a” relationship)ượ ớ
Ex. “WirelessTelephone
is a kind of Telephone.”
Lập trình hướng đối tượng – Thừa kế
16
Những gì được thừa kế ?
Thành viên
A
Thành viên
C
Thành viên
B
Thành viên
D
Thành viên
C
Thành viên
B
Thành viên
A
L p c sớ ơ ở
L p d n xu tớ ẫ ấ
D n xu t tẫ ấ ừ
D n xu t t c sẫ ấ ừ ơ ở
Đ c t o trong l p d n xu tượ ạ ớ ẫ ấ

Lập trình hướng đối tượng – Thừa kế
17
Thừa kế trong C++

M t l p có th đ c d n xu t t l p đã có theo d ng:ộ ớ ể ượ ẫ ấ ừ ớ ạ
class class_name: (
public
|
protected
|
private
) base_name
{
member declarations
};
•T khóaừ
protected
cho bi t che gi u thông tin l p c s ,ế ấ ở ớ ơ ở
ch có các thành viên c a l p d n xu t m i có th truy c pỉ ủ ớ ẫ ấ ớ ể ậ
đ c, còn các l p khác thông tin là private.ượ ớ
Lập trình hướng đối tượng – Thừa kế
18
Truy cập thành viên của lớp
Base
derived
Private
Public
Protected
Friend
Others

Lập trình hướng đối tượng – Thừa kế
19
Truy cập các thành viên được thừa kế

Việc truy cập các thành viên được thừa kế của
Việc truy cập các thành viên được thừa kế của
lớp dẫn xuất phụ thuộc nhiều vào các thành viên
lớp dẫn xuất phụ thuộc nhiều vào các thành viên
đó được khai báo public, private hoặc protected
đó được khai báo public, private hoặc protected
trong lớp dẫn xuất
trong lớp dẫn xuất

Ngoài ra, việc truy cập các thành viên được thừa
Ngoài ra, việc truy cập các thành viên được thừa
kế của lớp dẫn xuất còn phụ thuộc vào loại thừa
kế của lớp dẫn xuất còn phụ thuộc vào loại thừa
kế: public, private hoặc protected. Điều này được
kế: public, private hoặc protected. Điều này được
xác định trong định nghĩa của lớp dẫn xuất
xác định trong định nghĩa của lớp dẫn xuất
Về nguyên tắc, tất cả các thành viên của lớp cơ sở
đều được thừa kế trong lớp dẫn xuất, nhưng chỉ
khác ở khả năng truy cập mà thôi
Lập trình hướng đối tượng – Thừa kế
20
Thừa kế public

Các thành viên public của lớp cơ sở trở thành các
Các thành viên public của lớp cơ sở trở thành các

thành viên public của lớp dẫn xuất
thành viên public của lớp dẫn xuất

Các thành viên protected của lớp cơ sở trở thành
Các thành viên protected của lớp cơ sở trở thành
các thành viên protected của lớp dẫn xuất; và
các thành viên protected của lớp dẫn xuất; và

Các thành viên private của lớp cơ sở sẽ không
Các thành viên private của lớp cơ sở sẽ không
thể được truy cập bên trong lớp dẫn xuất
thể được truy cập bên trong lớp dẫn xuất
Lập trình hướng đối tượng – Thừa kế
21
Thừa kế protected

Các thành viên public của lớp cơ sở trở thành các
Các thành viên public của lớp cơ sở trở thành các
thành viên protected của lớp dẫn xuất
thành viên protected của lớp dẫn xuất

Các thành viên protected của lớp cơ sở trở thành
Các thành viên protected của lớp cơ sở trở thành
các thành viên protected của lớp dẫn xuất; và
các thành viên protected của lớp dẫn xuất; và

Các thành viên private của lớp cơ sở không thể
Các thành viên private của lớp cơ sở không thể
được truy cập bên trong lớp dẫn xuất
được truy cập bên trong lớp dẫn xuất

Lập trình hướng đối tượng – Thừa kế
22
Thừa kế private

Các thành viên public của lớp cơ sở trở thành các
Các thành viên public của lớp cơ sở trở thành các
thành viên private của lớp dẫn xuất
thành viên private của lớp dẫn xuất

Các thành viên protected của lớp cơ sở trở thành
Các thành viên protected của lớp cơ sở trở thành
các thành viên private của lớp dẫn xuất; và
các thành viên private của lớp dẫn xuất; và

Các thành viên private của lớp cơ sở không thể
Các thành viên private của lớp cơ sở không thể
được truy cập bên trong lớp dẫn xuất
được truy cập bên trong lớp dẫn xuất
Lập trình hướng đối tượng – Thừa kế
23
Truy cập các thành viên được thừa kế
B
private
privateprivate
private
protected
protected
protected
protected
public

public
public
public
D1: public B
D3: protected B
D2: private B
Not inherited
Lập trình hướng đối tượng – Thừa kế
24
Ví dụ: Truy cập các thành viên thừa kế
class A
{
private:
int m_iPrivate;

protected:
int m_iProtected;

public:
int m_iPublic;
};

class B : public A {};
class C : protected A {};
class D : private A{};
void main()
void main()
{
{
A a;

B b;
C c;
D d;

a.m_iPrivate = 1; // error!!!
a.m_iProtected = 1; // error!!!
a.m_iPublic = 1;

b.m_iPrivate = 1; // error!!!
b.m_iProtected = 1; // error!!!
b.m_iPublic = 1;

c.m_iPrivate = 1; // error!!!
c.m_iProtected = 1; // error!!!
c.m_iPublic = 1; // error!!!

d.m_iPrivate = 1; // error!!!
d.m_iProtected = 1; // error!!!
d.m_iPublic = 1; // error!!!
}
}
Lập trình hướng đối tượng – Thừa kế
25
Ví dụ: Thừa kế public
class Base
{
public:
int m1;
protected:
int m2;

private:
int m3;
};
class PublicClass : public Base
{
void test()
{
m1 = 1; // Still public
m2 = 2; // Still protected
m3 = 3; // Error. Not accessible
}
};
int main()
int main()
{
{
return 0;
return 0;
}
}

×