1. Trang chủ
  2. » Công Nghệ Thông Tin

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 8 pot

6 263 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 6,32 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chương 8: THỪA KẾ ẢO-TÍNH ĐA HÌNH Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG MỤC TIÊU  Giới thiệu khái niệm thừa kế ảo, hàm ảo 2 OOP-CHƯƠNG 8-TÍN

Trang 1

Chương 8:

THỪA KẾ ẢO-TÍNH ĐA HÌNH

Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

MỤC TIÊU

Giới thiệu khái niệm thừa kế ảo, hàm ảo

2 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

NỘI DUNG CHI TIẾT

TÍNH ĐA HÌNH

LIÊN KẾT TĨNH

LIÊN KẾT ĐỘNG

HÀM ẢO

THỪA KẾ ẢO

3 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Tính Đa Hình(Polymorphism)

Đa hình: “nhiều hình thức”, hành động cùng tên có thể được thực hiện khác nhau đối với các đối tượng/các lớp khác nhau

Đường Thẳng Hình Tròn

Vẽ

4 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Trang 2

TÍNH ĐA HÌNH

hành vi

Kỹ thuật cho phép thay đổi nội dung của cùng 1 hành vi

trong 2 lớp cha – con

code này khác nhau

lớp mà không cần quan tâm đến hiện thực của hành vi này.

5 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

VÍ DỤ VỀ TÍNH ĐA HÌNH

class Người void DiChuyển();

class ĐànÔng void DiChuyển();

class ĐànBà void DiChuyển();

class SHAPE

void Draw () { }

class CIRCLE

int x,y,r;

void Draw () { circle (x,y,r);

}

class RECTANGLE

int x1,y1, x2, y2;

void Draw () { rectangle(x1,y1, x2, y2);

}

class TRIANGLE

int x1,y1, x2, y2 , x3, y3;

void Draw () { line(x1,y1, x2, y2);

line(x2,y2, x3, y3);

line(x3,y3, x1, y1);

}

Đa hình tạo được tính mềm dẻo/linh động

của chương trình

6 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

OVERLOADED VÀ OVERRIDDEN

– Nhằm cung cấp các dạng khác nhau của hành vi (danh sách tham

số khác nhau), nhưng vẫn có cùng tên gọi trong cùng một lớp.

– Hiện thực lại hành vi đã có của tổ tiên

– Phải có cùng tên và trùng mọi yếu tố tạo nên hành vi này.

LIÊN KẾT TĨNH

Liên kết tĩnh (static binding):

– Xác định khi biên dịch chương trình.

– Dùng hàm thành viên.

– Gọi hàm của lớp cơ sở (lớp cha).

class ContactDir{ //

public:

int Lookup (const char

*name);

//

};

class SortedDir : public ContactDir {

public:

SortedDir(const int max) : ContactDir(max) {}

int Lookup(const char *name);

};

void main() { cout<<p->Lookup(“ABC”);

Trang 3

LIÊN KẾT ĐỘNG

– Xác định khi thực thi chương trình.

– Dùng hàm ảo (virtual function).

– Gọi hàm của lớp dẫn xuất (lớp con).

– Thể hiện tính đa hình của OOP.

class ContactDir{

//

public:

virtual int Lookup (const char *name);

};

class SortedDir : public ContactDir {

//…

public:

int Lookup(const char *name);

};

void main() {

ContactDir c1(10);

SortedDir *p1; p1 = &c1;

cout<<p->Lookup(“ABC”);

SortedDir c2(20);

ContactDir *p2; p2 = &c2;

cout<<p->Lookup(“ABC”);

}

Gọi hàm của lớp nào ?

9 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

HÀM ẢO

 Xem kết qủa của việc khái quát hóa sau:

class ANIMAL

void Travel();

class Bird

void Travel()

class Fish

void Travel()

class Snake

void Travel()

Bạn có hình dung nổi một ANIMAL di chuyển như thế nào không?

Bạn có hình dung nổi một đối tượng thuộc các lớp này di chuyển như thế nào không?

Không  Dùng hàm ảo

Có  cụ thể

10 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

HÀM ẢO

Là kết qủa của việc khái quát hóa qúa cao đến nỗi

không biết viết code thế nào

Là những hành vi chỉ khai báo mà không viết code

Để dành code cụ thể sẽ được hiện thực ở các lớp

dẫn xuất ( lớp cụ thể hơn)

Tư duy tự nhiên:

– Từ các đối tượng cụ thể  hàm cụ thể.

– Từ các lớp cụ thể có cùng tính chất  hàm ảo.

11 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

KHAI BÁO HÀM ẢO

virtual Tên hàm ảo () { }

12 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Trang 4

VÍ DỤ

Động cơ Nhiên liệu

Động cơ xăng

Động cơ 2 thì

Nhiên liệu Động cơ 4 thìNhiên liệu

13 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Class DongCo{

public:

virtual void NhienLieu(){ };

}

Class DongCoXang{

public:

void NhienLieu(){

cout<<“Dùng xăng hoặc xăng pha nhớt”; } }

public:

void NhienLieu(){

cout<<“Dùng dầu Diezel”;}

} Class DongCo2Thi{

public:

void NhienLieu(){

cout<<“Dùng xăng pha nhớt”;}

} Class DongCo4Thi{

public:

void NhienLieu(){

cout<<“Dùng xăng”;}

}

void main(){

DongCo *obj;

DongCo2Thi 2t;

DongCo4Thi 4t;

DongCoXang x;

DongCoDiezel d;

for(int i=0;i<4;i++) {

switch(i){

case 0: obj=&x;break;

case 1: obj=&d;break;

case 2: obj=&2t;break;

case 3: obj=&4t;break;}

obj->NhienLieu();}

}

Kết quả

in ra là gì?

14 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

PHÂN LOẠI PHƯƠNG THỨC ẢO

– Khai báo nhưng không làm gì

– Dùng tạo sự liên kết động trong hệ thống lớp kế thừa.

– Có thể khai báo đối tượng thuộc lớp có phương thức ảo rỗng và

gởi thông điệp đến đối tượng đó.

Ví dụ: DongCo obj; obj.NhienLieu();

– Lớp chứa phương thức này được gọi là lớp trừu tượng.

– Không thể khai báo đối tượng thuộc lớp này cũng như không thể

gởi thông điệp đến phương thức ảo thuần.

Class A{

VÍ DỤ HÀM ẢO – TÍNH ĐA HÌNH

HÀM ẢO

GIÁ THÀNH

Dữ liệu: đơn giá Phương thức:

+giá thành +diện tích +trị giá

HÌNH TRÒN

Dữ liệu: bán kính Phương thức:

+khởi tạo

HÌNH CHỮ NHẬT

Dữ liệu: dài, rộng Phương thức:

+khởi tạo

Trang 5

class GIATHANH{

protected: float dongia;

public:

giathanh (float c){ dongia=c);};

virtual dientich(){ }

float trigia() { return dientich()*dongia;}

}

class HINHTRON: public GIATHANH{

float bk;

public:

HINHTRON(float r, float c):

GIATHANH(c){

bk=r;}

float dientich(){

return bk*bk*M_PI;}

};

class HINHCN: public GIATHANH{

float dai,rong;

public:

HINHCN(float d,float r, float c):

GIATHANH(c){

dai=d;rong=r;}

float dientich(){ return dai*rong;}

};

void main(){

HINHTRON a(5,1000);

HINHCN b(2,4,2000);

cout<<“Tri gia hinh tron:<<a.trigia()<<endl;

cout<<“Tri gia hcn:”<<b.trigia()<<endl;

getch();

}

Nếu không khai báo hàm dientich là hàm ảo thì kết quả chương trình là gì?

17 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

THỪA KẾ ẢO

clas s A

clas s D

18 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Ví dụ

class A{

int dulieu;

//

};

class B: public A{};

class C: public A{};

class D: public B, public C{

//

};

D thừa kế A

“2 lần”

D có 2 thành phần

dữ liệu và 2 thành phần hành vi

Dư thừa dữ liệu

19 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Giải quyết

Để tránh tình trạng một thành phần trong lớp A xuất hiện 2 lần trong lớp D, sử dụng thừa kế ảo

class B: virtual public A{};

class C: virtual public A{};

class D: public B, public C{

//

};

20 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Trang 6

TÓM TẮT

Hàm ảo không nhất thiết phải được định nghĩa lại trong lớp

dẫn xuất.

Một lớp có hàm ảo thuần túy được gọi là lớp ảo (lớp trừu

tượng) Không thể khai báo đối tượng thuộc lớp ảo nhưng

có thể khai báo con trỏ có kiểu lớp trừu tượng.

Tính đa hình là khả năng các đối tượng của các lớp khác

nhau có quan hệ thừa kế phản ứng khác nhau đối với cùng

một lời gọi hàm thành phần.

21 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

THANK YOU

22 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH

Ngày đăng: 11/07/2014, 20:20

HÌNH ẢNH LIÊN QUAN

HÌNH TRÒN - LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 8 pot
HÌNH TRÒN (Trang 4)

TỪ KHÓA LIÊN QUAN

w