OOP Chuong6
-
Upload
cuonglytrung -
Category
Documents
-
view
2 -
download
0
description
Transcript of OOP Chuong6
-
CHNG 6. A HNH
-
Ni dung
Gii thiu1
Vng chn kiu2
Phng thc o3
Phng thc thun o4
Bi ton Tnh tin lng55
2Lp trnh hng i tng
-
Gii thiu
Tnh a hnh xut hin khi c s k tha gia
cc lp.
C nhng phng thc tng qut cho mi lp
dn xut nn c mt lp c s nhng ni dung
ca n ch c xc nh cc lp dn xut c
th.
V d, Phng thc tnh din tch ca lp hnh,
hnh tam gic, t gic,
3Lp trnh hng i tng
-
Gii thiu
a hnh: L hin tng cc i tng thuc cc
lp khc nhau c kh nng hiu cng mt thng
ip theo cc cch khc nhau.
V d: Nhn c cng mt thng ip nhy,
mt con kangaroo v mt con cc nhy theo hai
kiu khc nhau: chng cng c hnh vi nhy
nhng cc hnh vi ny c ni dung khc nhau.
4Lp trnh hng i tng
-
Bi ton
Gi s, cn qun l danh sch cc i tng c
kiu c th khc nhau Cn gii quyt 2 vn :
Cch lu tr
Thao tc x l
Xt trng hp c th, cc i tng c th l
Ngi, Sinh vin hoc Cng nhn.
5Lp trnh hng i tng
-
Bi ton
V mt lu tr:
C th dng mng
Danh sch lin kt
V thao tc: Phi tha yu cu a hnh, thao tc
c hot ng khc nhau ng vi cc loi i
tng khc nhau
C hai cch giiquyt vn :- Vng chn kiu- Phng thc o
6Lp trnh hng i tng
-
V d
class Nguoi {
protected:
char *HoTen;
int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns){HoTen=strdup(ht);}
~Nguoi() {delete [ ] HoTen;}
void An() const { cout
-
V d
class SinhVien : public Nguoi{
protected:
char *MaSo;
public:
SinhVien(char *n, char *ms, int ns) : Nguoi(n,ns) {
MaSo = strdup(ms);
}
~SinhVien() { delete [ ] MaSo;}
void Xuat() const {
cout
-
V d
class NuSinh : public SinhVien
{
public:
NuSinh( char *ht, char *ms, int ns) : SinhVien(ht,ms,ns) {
}
void An() const
{
cout
-
V d
class CongNhan : public Nguoi{
protected:
double MucLuong;
public:
CongNhan( char *n, double ml, int ns) : Nguoi(n,ns),
MucLuong(ml){ }
void Xuat() const {
cout
-
V d
void XuatDs(int n, Nguoi *an[ ])
{
for (int i = 0; i < n; i++)
{
an[i] Xuat();
cout
-
V d
const int N = 4;
void main(){
Nguoi *a[N];
a[0] = new SinhVien(Vien Van Sinh, 200001234, 1982);
a[1] = new NuSinh(Le Thi Ha Dong, 200001235, 1984);
a[2] = new CongNhan(Tran Nhan Cong, 1000000, 1984);
a[3] = new Nguoi(Nguyen Thanh Nhan, 1960);
XuatDs(4,a);
}
Nguoi, ho ten: Vien Van Sinh sinh 1982
Nguoi, ho ten: Le Thi Ha Dong sinh 1984
Nguoi, ho ten: Tran Nhan Cong sinh 1984
Nguoi, ho ten: Nguyen Thanh Nhan sinh 196012Lp trnh hng i tng
-
Dng vng chn kiu
bo m xut liu tng ng vi i tng,
phi c cch nhn din i tng
Ta thm mt vng d liu vo lp c s nhn din
Vng ny c gi tr ph thuc vo loi ca i tng
v c gi l vng chn kiu.
Cc i tng thuc lp ngi c cng gi tr
cho vng chn kiu, cc i tng thuc lp sinh
vin c gi tr ca vng chn kiu khc ca lp
ngi.13Lp trnh hng i tng
-
Dng vng chn kiu V d
class Nguoi{
public: enum LOAI {NGUOI, SV, CN};
protected:
char *HoTen; int NamSinh;
public:
LOAI pl;
Nguoi(char *ht, int ns):NamSinh(ns), pl(NGUOI) {HoTen = strdup(ht);}
~Nguoi() {delete [] HoTen;}
void An() const { cout
-
Dng vng chn kiu V d
class SinhVien : public Nguoi{
protected:
char *MaSo;
public:
SinhVien(char *n, char *ms, int ns) : Nguoi(n,ns) {
MaSo = strdup(ms); pl = SV;
}
~SinhVien() {delete [ ] MaSo;}
void Xuat() const {
cout
-
Dng vng chn kiu V d
class CongNhan : public Nguoi{
protected:
double MucLuong;
public:
CongNhan( char *n, double ml, int ns) : Nguoi(n,ns), MucLuong(ml){
pl = CN;
}
void Xuat() const{
cout
-
Dng vng chn kiu V d
void XuatDs(int n, Nguoi *an[]) {
for (int i = 0; i < n; i++){
switch(an[i]->pl){
case Nguoi::SV:
((SinhVien *)an[i])Xuat(); break;
case Nguoi::CN:
((CongNhan *)an[i])Xuat(); break;
default:
an[i]->Xuat(); break;
}
cout
-
Dng vng chn kiu V d
const int N = 4;
void main(){
Nguoi *a[N];
a[0] = new SinhVien(Vien Van Sinh, 200001234, 1982);
a[1] = new NuSinh(Le Thi Ha Dong, 200001235, 1984);
a[2] = new CongNhan(Tran Nhan Cong, 1000000, 1984);
a[3] = new Nguoi(Nguyen Thanh Nhan, 1960);
XuatDs(4,a);
}
Sinh vien Vien Van Sinh, ma so 200001234
Sinh vien Le Thi Ha Dong, ma so 200001235
Cong nhan, ten Tran Nhan Cong muc luong:1000000
Nguoi, ho ten: Nguyen Thanh Nhan sinh 1960
18Lp trnh hng i tng
-
Dng vng chn kiu
Cch tip cn trn gii quyt c vn : Lu
tr cc i tng khc kiu nhau v thao tc
khc nhau tng ng tng i tng. Tuy nhin,
tn ti mt s khuyt im:
M lnh di dng (nhiu switch case)
D sai st, kh sa
Kh nng cp, bo tr
Cc nhc im trn c th khc phc c nh
phng thc o.
19Lp trnh hng i tng
-
Phng thc o
Phng thc o:
L cch th hin tnh a hnh trong ngn ng C++.
Cc phng thc lp c s c tnh a hnh phi
c nh ngha l mt phng thc o
Con tr thuc lp c s c th tr n lp con:
Nguoi* pn=new SinhVien(Le Vien Sinh,TH11001,1982);
20Lp trnh hng i tng
-
Phng thc o
Ta mong mun thng qua con tr thuc lp c
s c th truy xut hm thnh phn c nh
ngha li lp con
pn->Xuat();
//Mong muon: goi Xuat cua lop sinh vien,
//Thuc te: goi Xuat cua lop Nguoi
21Lp trnh hng i tng
-
Phng thc o
Phng thc o cho php gii quyt vn trn.
Ta qui nh mt hm thnh phn l phng thc
o bng cch thm t kha virtual vo trc khai
bo hm.
Trong v d trn, ta thm t kha virtual vo
trc khai bo ca hm Xuat.
22Lp trnh hng i tng
-
Phng thc o V d
class Nguoi {
protected:
char *HoTen;
int NamSinh;
public:
Nguoi( char *ht,int ns):NamSinh(ns){HoTen = strdup(ht);}
~Nguoi() {delete [ ] HoTen;}
void An() const { cout
-
Thm lp con mi
Dng phng thc o, ta d dng nng cp sa
cha.
Thm mt loi i tng mi rt n gin, khng
cn sa i thao tc x l (XuatDs).
Qui trnh thm ch l xy dng lp con k tha
lp c s v nh ngha li phng thc (o)
lp mi to nu cn.
24Lp trnh hng i tng
-
Thm lp con mi V d
class CaSi : public Nguoi{
protected:
double CatXe;
public:
CaSi( char *ht, double cx, int ns): Nguoi(ht,ns),CatXe(cx)
{ }
void Xuat() const {
cout
-
Thm lp con mi
Hm XuatDs khng thay i, nhng n c th
hot ng cho cc loi i tng ca s thuc lp
mi ra i.
void XuatDs( int n, Nguoi *an[]){
for ( int i = 0; i < n; i++){
an[i]->Xuat();
cout
-
Lu khi s dng phng thc o
Phng thc o ch hot ng thng qua con tr.
Mun mt hm tr thnh phng thc o c hai
cch:
Khai bo vi t kho virtual
Hoc phng thc tng ng lp c s l
phng thc o.
27Lp trnh hng i tng
-
Lu khi s dng phng thc o
Phng thc o ch hot ng nu cc phng
thc lp c s v lp con c nghi thc giao
tip ging ht nhau.
Nu lp con khng nh ngha li phng thc
o th s gi phng thc lp c s (gn nht
c nh ngha).
28Lp trnh hng i tng
-
C ch thc hin phng thc o
Khi gi mt thao tc, kh nng chn ng phin
bn ty theo i tng thc hin thng qua
con tr n lp c s c gi l tnh a hnh
(polymorphisms).
C ch a hnh c thc hin nh mi i
tng c thm mt bng phng thc o. Bng
ny cha a ch ca cc phng thc o v n
c trnh bin dch khi to mt cch ngm
nh khi thit lp i tng.29Lp trnh hng i tng
-
C ch thc hin phng thc o
Khi thao tc c thc hin thng qua con tr,
hm c a ch trong bng phng thc o s
c gi.
Trong v d trn, mi i tng thuc lp c s
Nguoi c bng phng thc o c mt phn t l
a ch hm Nguoi::Xuat. Mi i tng thuc lp
SinhVien c bng tng t nhng ni dung l a
ch ca hm SinhVien::Xuat.
30Lp trnh hng i tng
-
Phng thc hy b o
Trong v d qun l danh sch cc i tng
thuc cc lp Nguoi, SinhVien, CongNhan,
Thao tc dn dp i tng l cn thit
const int N = 4;
void main(){
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "20001234,1982);
a[1] = new NuSinh("Le Thi Ha Dong", "20001235,1984);
a[2] = new CongNhan("Tran Nan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
for ( int i = 0; i < 4; i++)
delete a[i];
}31Lp trnh hng i tng
-
Phng thc hy b o
Thng qua con tr thuc lp c s Nguoi, ch c
phng thc hy b ca lp Nguoi c gi.
bo m vic dn dp l y , ta phi dng
phng thc hy b o.
class Nguoi{
protected:
char *HoTen; int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns) {
HoTen = strdup(ht);
}
virtual ~Nguoi() {
delete [ ] HoTen;
}
virtual void Xuat(ostream &os) const {//}
};
32Lp trnh hng i tng
-
Phng thc thun ov lp c s tru tng
Lp c s tru tng l lp c s khng c i
tng no thuc chnh n.
Xt cc lp Circle, Rectangle, Square k tha t
lp Shape
Trong v d trn, cc hm trong lp Shape c ni
dung nhng ni dung khng c ngha. ng
thi ta lun lun c th to c i tng thuc
lp Shape, iu ny khng ng vi t tng
ca phng php lun hng i tng.33Lp trnh hng i tng
-
Phng thc thun ov lp c s tru tng
Ta c th thay th cho ni dung khng c ngha
bng phng thc o thun tu. Phng thc o
thun tu l phng thc o khng c ni dung.
Khi lp c phng thc o thun tu, lp tr
thnh lp c s tru tng. Ta khng th to i
tng thuc lp c s thun tu.
Ta c th nh ngha phng thc o thun tu,
nhng ch c cc i tng thuc lp con c th
gi n.34Lp trnh hng i tng
-
Phng thc thun ov lp c s tru tng
Trong v d trn, cc hm thnh phn trong lp
Shape l phng thc o thun tu. N bo m
khng th to c i tng thuc lp Shape.
V d trn cng nh ngha ni dung cho phng
thc o thun tu, nhng ch c cc i tng
thuc lp con c th gi.
35Lp trnh hng i tng
-
Phng thc thun ov lp c s tru tng
Phng thc o thun tu c ngha cho vic t
chc s phn cp cc lp, n ng vai tr
cha sn ch trng cho cc lp con in vo vi
phin bn ph hp.
Bn thn cc lp con ca lp c s tru tng
cng c th l lp c s tru tng
36Lp trnh hng i tng
-
V d
Shape
virtual void draw()
Circle
public void draw()
Triangle
public void draw()
class Shape //Abstract{
public ://Pure virtual Functionvirtual void draw() = 0;
}
37Lp trnh hng i tng
-
V d
class Circle : public Shape { //No draw() - Abstractpublic:void print(){cout
-
Bi ton Tnh tin lng
Bi ton: Cng ty ABC l cng ty sn xut kinh
doanh th nhi bng. Cng ty c nhiu nhn vin
lm vic trong ba b phn khc nhau: b phn
qun l, b phn sn xut, b phn vn phng.
Vic tnh lng cho nhn vin da vo cc yu
t sau:
i vi nhn vin vn phng: Lng = Lng C Bn
+ S ngy lm vic *100.000 + Tr Cp
39Lp trnh hng i tng
-
Bi ton Tnh tin lng
i vi nhn vin sn xut: Lng = Lng C Bn +
S Sn Phm * 2.000
i vi nhn vin qun l: Lng = Lng C Bn*
H s chc v + Thng.
Ngoi ra cng ty cn qun l cc thng tin v
nhn vin ca mnh nh: h tn, ngy sinh v
cc thng s trn tnh lng cho tng nhn
vin trong cng ty.
40Lp trnh hng i tng
-
Bi ton Tnh tin lng
Yu cu: Thit k cc lp thch hp thc hin
cc yu cu sau:
Nhp thng tin ca cc nhn vin phc v cho vic
tnh lng.
Thc hin vic tnh lng cho tng nhn vin.
Xut thng tin ca cc nhn vin.
Tnh tng lng ca cng ty.
Tm kim mt nhn vin theo h tn.
41Lp trnh hng i tng
-
Q & A
42Lp trnh hng i tng