Tải bản đầy đủ (.pdf) (24 trang)

Lập trình hướng đối tượng tren C/C++ - OOP 09 interface and polymorphism

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 (507.43 KB, 24 trang )

Interface Interface
vàvà
ĐaĐa
hìnhhình
GV. GV. NguyễnNguyễn Minh Minh HuyHuy
Interface Interface
vàvà
ĐaĐa
hìnhhình
1Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
 KháiKhái niệmniệm interface.interface.
 HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 PhươngPhương thứcthức hủyhủy ảoảo
2Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
 KháiKhái niệmniệm interface.interface.
 HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 PhươngPhương thứcthức hủyhủy ảoảo
3Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
KháiKhái niệmniệm interfaceinterface
 GiaoGiao tiếptiếp giữagiữa đốiđối tượngtượng vàvà bênbên ngoàingoài::

QuyQuy tắctắc hộphộp đenđen::
 ThuộcThuộc tínhtính: : private, private, hạnhạn chếchế truytruy xuấtxuất
 PhươngPhương thứcthức: : public, public, cungcung cấpcấp tínhtính năngnăng
 ĐốiĐối tượngtượng giaogiao tiếptiếp qua qua phươngphương thứcthức

PhầnPhần
khaikhai
báobáo


phươngphương
thứcthức

INTERFACE.INTERFACE.

PhầnPhần
khaikhai
báobáo
phươngphương
thứcthức

INTERFACE.INTERFACE.
4Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Dữ liệu
(Thuộc tính)
Tính năng
(Phương thức)
KháiKhái niệmniệm interfaceinterface
 ĐặcĐặc điểmđiểm Interface:Interface:

LàLà ““phầnphần vỏvỏ” ” củacủa lớplớp
LớpLớp = = InterfaceInterface + + KhaiKhai báobáo private + private + CàiCài đặtđặt
 QuyQuy địnhđịnh cáchcách thứcthức giaogiao tiếptiếp
 KhôngKhông chứachứa càicài đặtđặt
void void
xuLyxuLy
((
PhanSoPhanSo
pp
))

Nhận interface PhanSo
class class PhanSoPhanSo
{{
private:private:
intint m_tum_tu;;
intint m_maum_mau;;
public:public:
PhanSoPhanSo((intint tutu, , intint maumau););
PhanSoPhanSo rutGonrutGon();();
PhanSoPhanSo nghichDaonghichDao();();
};};
5Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
void void
xuLyxuLy
((
PhanSoPhanSo
pp
))
{{ // // XửXử lýlý trêntrên pp
}}
void main()void main()
{{
PhanSoPhanSo p1(1, 2);p1(1, 2);
PhanSoPhanSo p2(1, 3);p2(1, 3);
xuLyxuLy(p1);(p1);
xuLyxuLy(p2);(p2);
}}
KháiKhái niệmniệm interfaceinterface
 Interface Interface trongtrong kếkế thừathừa::


LớpLớp kếkế thừathừa thừathừa hưởnghưởng::
 ThuộcThuộc tínhtính từtừ lớplớp cơcơ sởsở
 PhươngPhương thứcthức từtừ lớplớp cơcơ sởsở
 ThừaThừa hưởnghưởng interface interface củacủa lớplớp cơcơ sởsở
LớpLớp
kếkế
thừathừa
cócó
interface interface
củacủa
lớplớp
cơcơ
sởsở


LớpLớp
kếkế
thừathừa
cócó
interface interface
củacủa
lớplớp
cơcơ
sởsở

 HàmHàm nhậnnhận đốiđối tượngtượng lớplớp cơcơ sởsở
 CũngCũng nhậnnhận đốiđối tượngtượng lớplớp kếkế thừathừa
 Con Con trỏtrỏ kiểukiểu lớplớp cơcơ sởsở
 CóCó thểthể trỏtrỏ đếnđến đốiđối tượngtượng lớplớp kếkế thừathừa
6Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy

KháiKhái niệmniệm interfaceinterface
 Interface Interface vàvà trongtrong kếkế thừathừa::
class class AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “Don’t talk”; }<< “Don’t talk”; }
};};
class class
CatCat
: public : public
AnimalAnimal
void void xuLyxuLy((Animal pAnimal p))
{{
p.talkp.talk();();
}}
void main()void main()
{{
Animal a;Animal a;
Nhận interface Animal
class class
CatCat
: public : public
AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “MeoMeo meomeo”; }”; }
};};
class class DogDog: public : public AnimalAnimal
{{
public:public:

void talk() void talk() { { coutcout << “<< “GauGau gaugau”; }”; }
};};
7Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Animal a;Animal a;
CatCat c;c;
Dog d;Dog d;
xuLyxuLy(a);(a);
xuLyxuLy(c);(c);
xuLyxuLy(d);(d);
Animal *p;Animal *p;
p = &a;p = &a;
p = &c;p = &c;
p = &d;p = &d;
}}
Nhận
interface
Animal
NộiNội dungdung
 KháiKhái niệmniệm interface.interface.
 HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 PhươngPhương thứcthức hủyhủy ảoảo
8Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 VấnVấn đềđề liênliên kếtkết tĩnhtĩnh trongtrong C++:C++:
class class AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “Don’t talk”; }<< “Don’t talk”; }
};};
class class

CatCat
: public : public
AnimalAnimal
void void xuLyxuLy((Animal pAnimal p))
{{
p.talkp.talk();();
}}
void main()void main()
{{
CatCat
c;c;
Liên kết
cài đặt
Animal
class class
CatCat
: public : public
AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “MeoMeo meomeo”; }”; }
};};
class class DogDog: public : public AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “GauGau gaugau”; }”; }
};};
9Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
CatCat
c;c;

Dog d;Dog d;
xuLyxuLy(c);(c);
xuLyxuLy(d);(d);
Animal *p;Animal *p;
p = &c;p = &c;
pp >talk();>talk();
p = &d;p = &d;
pp >talk();>talk();
}}
Liên kết
cài đặt
Animal
HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 KháiKhái niệmniệm hàmhàm ảoảo::

PhươngPhương thứcthức bìnhbình thườngthường::
 LờiLời gọigọi hàmhàm gắngắn vớivới càicài đặtđặt hàmhàm lúclúc dịchdịch  LiênLiên kếtkết tĩnhtĩnh
 HàmHàm ảoảo::
 PhươngPhương thứcthức đặcđặc biệtbiệt
LờiLời
gọigọi
hàmhàm
chỉchỉ
gắngắn
vớivới
interface interface

LiênLiên
kếtkết
độngđộng



LờiLời
gọigọi
hàmhàm
chỉchỉ
gắngắn
vớivới
interface interface

LiênLiên
kếtkết
độngđộng

 BỏBỏ ngỏngỏ phầnphần càicài đặtđặt
 ĐượcĐược gắngắn độngđộng vàovào lúclúc chạychạy
 TùyTùy thuộcthuộc đốiđối tượngtượng gọigọi phươngphương thứcthức
 TrongTrong C++:C++:
 KhaiKhai báobáo: : virtualvirtual <<ChữChữ kýký hàmhàm>;>;
 ChỉChỉ dùngdùng đượcđược vớivới con con trỏtrỏ đốiđối tượngtượng
10Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 VấnVấn đềđề liênliên kếtkết tĩnhtĩnh trongtrong C++:C++:
class class AnimalAnimal
{{
public:public:
virtual void talk() virtual void talk() { { coutcout << “Don’t talk”; }<< “Don’t talk”; }
};};
class class
CatCat

: public : public
AnimalAnimal
void void xuLyxuLy((Animal *pAnimal *p))
{{
pp >talk();>talk();
}}
void main()void main()
{{
CatCat
c;c;
Liên kết
interface
Animal
Bỏ ngõ
cài
đặt
class class
CatCat
: public : public
AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “MeoMeo meomeo”; }”; }
};};
class class DogDog: public : public AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “GauGau gaugau”; }”; }
};};
11Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy

CatCat
c;c;
DogDog d;d;
xuLyxuLy(c);(c);
xuLyxuLy(d);(d);
Animal *p;Animal *p;
p = &c;p = &c;
pp >talk();>talk();
p = &d;p = &d;
pp >talk();>talk();
}}
cài
đặt
Liên kết
interface
Animal
Bỏ ngõ
cài đặt
HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 XâyXây dựngdựng interface interface trongtrong C++:C++:

C++ C++ giảgiả lậplập interface interface bằngbằng abstract class.abstract class.
 ĐặcĐặc điểmđiểm abstract class:abstract class:
 KhaiKhai báobáo lớplớp: : dùngdùng từtừ khóakhóa “abstract”“abstract”
 KhaiKhai báobáo phươngphương thứcthức: : hàmhàm ảoảo thêmthêm ““dấudấu =“=“ ở ở cuốicuối
KhôngKhông
cócó
thuộcthuộc
tínhtính
vàvà

càicài
đặtđặt
phươngphương
thứcthức


KhôngKhông
cócó
thuộcthuộc
tínhtính
vàvà
càicài
đặtđặt
phươngphương
thứcthức

 KhôngKhông thểthể tạotạo đốiđối tượngtượng từtừ abstract class.abstract class.
 Abstract class Abstract class chỉchỉ dùngdùng đểđể kếkế thừathừa
abstractabstract class Animalclass Animal
{{
public:public:
virtual virtual void talk()void talk() = 0;= 0;
};};
12Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Hàm thuần ảo, không cần cài đặt!!
HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 XâyXây dựngdựng interface interface trongtrong C++:C++:
abstractabstract class class AnimalAnimal
{{
public:public:

virtual void talk() = 0;virtual void talk() = 0;
};};
class class
CatCat
: public : public
AnimalAnimal
void void xuLyxuLy((Animal *pAnimal *p))
{{
pp >talk();>talk();
}}
void main()void main()
{{
CatCat
c;c;
class class
CatCat
: public : public
AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “MeoMeo meomeo”; }”; }
};};
class class DogDog: public : public AnimalAnimal
{{
public:public:
void talk() void talk() { { coutcout << “<< “GauGau gaugau”; }”; }
};};
13Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
CatCat
c;c;

DogDog d;d;
xuLyxuLy(c);(c);
xuLyxuLy(d);(d);
Animal *p;Animal *p;
p = new Animal; // p = new Animal; // SaiSai
p = new Cat; // p = new Cat; // ĐúngĐúng
pp >talk();>talk();
}}
HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 Ý Ý nghĩanghĩa củacủa liênliên kếtkết độngđộng::

GiaoGiao tiếptiếp thôngthông qua interface.qua interface.
 CàiCài đặtđặt thaythay đổiđổi độngđộng tùytùy nhunhu cầucầu ngườingười dùngdùng
 ThíchThích ứngứng vớivới thaythay đổiđổi
void void giveATalkgiveATalk((Animal *pAnimal *p))
{{
void void giveATalkgiveATalk((Cat c, Dog d, Cat c, Dog d, intint typetype))
{{
{{
pp >talk();>talk();
}}
14Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
{{
if (type if (type == 0== 0))
c.talkc.talk();();
else else if (if (iTypeiType == 1== 1))
d.talkd.talk();();
}}
NộiNội dungdung
 KháiKhái niệmniệm interface.interface.

 HàmHàm ảoảo vàvà liênliên kếtkết độngđộng
 PhươngPhương thứcthức hủyhủy ảoảo
15Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
PhươngPhương thứcthức hủyhủy ảoảo
 XétXét víví dụdụ::
class class GiaoVienGiaoVien
{{
private:private:
charchar **m_hoTenm_hoTen;;
public:public:
~~GiaoVienGiaoVien() () { delete { delete m_hoTenm_hoTen; }; }
};};
void main()void main()
{{
GiaoVienGiaoVien *p1 = new *p1 = new GiaoVienGiaoVien;;
delete p1;delete p1;
GVCNGVCN *p2 = new GVCN;*p2 = new GVCN;
delete p2;delete p2;
};};
class class GVCNGVCN : public : public GiaoVienGiaoVien
{{
private:private:
charchar **m_strLopCNm_strLopCN;;
public:public:
~GVCN() ~GVCN() { delete { delete m_strLopCNm_strLopCN; }; }
};};
16Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
delete p2;delete p2;
GiaoVienGiaoVien *p3 = new GVCN;*p3 = new GVCN;
delete p3;delete p3;

}}
Thứ tự gọi phương thức hủy??
PhươngPhương thứcthức hủyhủy ảoảo
 Dr. Guru Dr. Guru khuyênkhuyên::

PhươngPhương thứcthức hủyhủy củacủa lớplớp phảiphải luônluôn làlà hàmhàm ảoảo
 LiênLiên kếtkết độngđộng đếnđến phươngphương thứcthức hủyhủy lớplớp kếkế thừathừa
class class GiaoVienGiaoVien
{{
private:private:
charchar **m_hoTenm_hoTen;;
public:public:
virtualvirtual ~~GiaoVienGiaoVien() { delete () { delete m_strHoTenm_strHoTen; }; }
};};
GiaoVienGiaoVien *p3 = new GVCN;*p3 = new GVCN;
delete p3;delete p3;
17Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
~GVCN()
~GiaoVien()
TómTóm tắttắt
 KháiKhái niệmniệm interface:interface:

LớpLớp = Interface + = Interface + KhaiKhai báobáo private + private + CàiCài đặtđặt
 LớpLớp kếkế thừathừa thừathừa hưởnghưởng interface interface lớplớp cơcơ sởsở
 GiảGiả lậplập interface interface trongtrong C++: abstract class.C++: abstract class.

HàmHàm
ảoảo
::


HàmHàm
ảoảo
::
 ChỉChỉ ràngràng buộcbuộc vớivới interface, interface, khôngkhông ràngràng buộcbuộc càicài đặtđặt
 KhaiKhai báobáo dùngdùng “virtual”“virtual”
 PhươngPhương thứcthức hủyhủy ảoảo::

PhươngPhương thứcthức hủyhủy phảiphải luônluôn làlà hàmhàm ảoảo
18Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
 BàiBài tậptập 9.1:9.1:
class Aclass A
{ public:{ public:
[[yyyyyy]] void f1() { void f1() { coutcout << “Good morning.<< “Good morning.\\n”; n”; f2();f2(); }}
[[zzzzzz]] void f2() { void f2() { coutcout << “Good afternoon.<< “Good afternoon.\\n”; }n”; }
};};
class B: public Aclass B: public A
{ public:{ public:
Cho Cho biếtbiết nhữngnhững gìgì xuấtxuất hiệnhiện
trêntrên mànmàn hìnhhình trongtrong cáccác
trườngtrường hợphợp::
a) [a) [yyyyyy] ] trốngtrống, [, [zzzzzz] ] trốngtrống
b) [b) [yyyyyy] ] trốngtrống, [, [zzzzzz] virtual.] virtual.
c) [c) [
yyyyyy
] virtual, [] virtual, [
zzzzzz
] ]
trốngtrống


{ public:{ public:
void f1() { void f1() { coutcout << “Good evening.<< “Good evening.\\n”; n”; f2();f2(); }}
void f2() { void f2() { coutcout << “Good night.<< “Good night.\\n”; }n”; }
};};
void main()void main()
{{
A *p = new B;A *p = new B;
pp >f1();>f1();
}}
19Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
c) [c) [
yyyyyy
] virtual, [] virtual, [
zzzzzz
] ]
trốngtrống

d) [d) [yyyyyy] virtual, [] virtual, [zzzzzz] virtual.] virtual.
BàiBài tậptập
 BàiBài tậptập 9.2:9.2:
Cho 2 Cho 2 loạiloại hìnhhình::
HìnhHình tam tam giácgiác: : biểubiểu diễndiễn bởibởi 3 3 đỉnhđỉnh
HìnhHình chữchữ nhậtnhật: : biểubiểu diễndiễn bởibởi 2 2 điểmđiểm trêntrên tráitrái vàvà dướidưới phảiphải
ViếtViết hàmhàm nhậnnhận vàovào danhdanh sáchsách 2 2 loạiloại hìnhhình trêntrên vàvà xuấtxuất thôngthông tin tin cáccác hìnhhình
cócó
trongtrong
danhdanh
sáchsách

cócó

trongtrong
danhdanh
sáchsách

NếuNếu thêmthêm vàovào loạiloại hìnhhình mớimới làlà hìnhhình tròntròn
HìnhHình tròntròn: : biểubiểu diễndiễn bởibởi tâmtâm vàvà bánbán kínhkính
KhiKhi đóđó, , chươngchương trìnhtrình sẽsẽ thaythay đổiđổi nhưnhư thếthế nàonào??
20Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
 BàiBài tậptập 9.3:9.3:
Cho Cho bảngbảng tốctốc độđộ chạychạy củacủa cáccác độngđộng vậtvật nhưnhư sausau::
Động vậtĐộng vật Tốc độTốc độ
BáoBáo 100km/h100km/h
Linh dươngLinh dương 80km/h80km/h
SưSư
tửtử
70km/h70km/h
ViếtViết hàmhàm nhậnnhận vàovào 2 2 độngđộng vậtvật trongtrong bảngbảng trêntrên vàvà
so so sánhsánh tốctốc độđộ chạychạy giữagiữa chúngchúng
NếuNếu thêmthêm vàovào con con ngựangựa chạychạy 60km/h, 60km/h, khikhi đóđó
chươngchương trìnhtrình sẽsẽ thaythay đổiđổi nhưnhư thếthế nàonào??
21Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
SưSư
tửtử
70km/h70km/h
ChóChó 60km/h60km/h
NgườiNgười 30km/h30km/h
BàiBài tậptập
 BàiBài tậptập 9.4:9.4:
Cho Cho bảngbảng cáchcách thứcthức hoạthoạt độngđộng củacủa cáccác loàiloài độngđộng vậtvật nhưnhư sausau::

ĂnĂn Di chuyểnDi chuyển Sinh sảnSinh sản
Cá mậpCá mập TạpTạp BơiBơi Đẻ trứngĐẻ trứng
CáCá chépchép Phiêu sinhPhiêu sinh BơiBơi Đẻ trứngĐẻ trứng
Sư tửSư tử
TạpTạp
ChạyChạy
Đẻ conĐẻ con
22Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Sư tửSư tử
TạpTạp
ChạyChạy
Đẻ conĐẻ con
BòBò CỏCỏ ChạyChạy Đẻ conĐẻ con
Cá voiCá voi Phiêu sinhPhiêu sinh BơiBơi Đẻ conĐẻ con
ChimChim sẻsẻ Sâu bọSâu bọ BayBay Đẻ trứngĐẻ trứng
Đại bàngĐại bàng TạpTạp BayBay Đẻ trứngĐẻ trứng
CáCá sấusấu TạpTạp Bò, BơiBò, Bơi Đẻ trứngĐẻ trứng
Tắc kèTắc kè TạpTạp BòBò ĐẻĐẻ trứngtrứng
DơiDơi TạpTạp BayBay ĐẻĐẻ concon
BàiBài tậptập
 BàiBài tậptập 9.4:9.4:
HãyHãy xâyxây dựngdựng cáccác interface interface X, Y, Z, U, VX, Y, Z, U, V vàvà ápáp dụngdụng chocho nhữngnhững độngđộng
vậtvật trongtrong bảngbảng đểđể chúngchúng cócó thểthể thamtham giagia vàovào nhữngnhững hoạthoạt độngđộng sausau::
void void thiBoithiBoi((XX dv1, dv1, XX dv2)dv2)
{{
dv1.boi();dv1.boi();
dv2.boi();dv2.boi();
void void nuoiCanuoiCa((UU dvdv))
{{
dv.boi();dv.boi();

U con = U con =
dv.deTrungdv.deTrung
();();
dv2.boi();dv2.boi();
}}
void void thiBaythiBay((YY dv1, dv1, YY dv2)dv2)
{{
dv1.bay();dv1.bay();
dv2.bay();dv2.bay();
}}
void void thuanHoaThuthuanHoaThu((ZZ dvdv))
{{
Z con = Z con = dv.deCondv.deCon();();
}}
23Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
U con = U con =
dv.deTrungdv.deTrung
();();
}}
void void nuoiBoSatnuoiBoSat((VV dvdv))
{{
dv.bo();dv.bo();
dv.anTapdv.anTap();();
V con = V con = dv.deTrungdv.deTrung();();
}}
BàiBài tậptập
 BàiBài tậptập 9.5 (*):9.5 (*):
Cho Cho lớplớp Line Line vàvà Rectangle Rectangle dùngdùng vẽvẽ đườngđường thẳngthẳng vàvà hìnhhình chữchữ nhậtnhật::
class class LineLine
{{

private:private:
Point m_p1;Point m_p1;
Point m_p2;Point m_p2;
class class RectangleRectangle
{{
private:private:
Point m_p1;Point m_p1;
Point m_p2;Point m_p2;
Point m_p2;Point m_p2;
public:public:
void void drawLinedrawLine();();
};};
HãyHãy viếtviết hàmhàm vẽvẽ đườngđường thẳngthẳng vàvà hìnhhình chữchữ nhậtnhật
từtừ mộtmột danhdanh sáchsách hìnhhình chocho trướctrước
YêuYêu cầucầu::
SửSử dụngdụng ((khôngkhông chỉnhchỉnh sửasửa) ) lớplớp Line Line vàvà Rectangle.Rectangle.
HàmHàm vẽvẽ phảiphải khôngkhông đổiđổi khikhi thêmthêm hìnhhình mớimới vàovào
24Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Point m_p2;Point m_p2;
public:public:
void void drawRectdrawRect();();
};};

×