Download - Chuong 07 - Tinh Da Hinh
-
CHNG 7. TNH A HNH
ThS. Trn Anh Dng
-
Ni dung
05/12/2014 Lp trnh hng i tng 2
Gii thiu 1
Vng chn kiu 2
Phng thc o 3
Phng thc thun o 4
Bi ton Tnh tin lng 5 5
-
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,
05/12/2014 Lp trnh hng i tng 3
-
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.
05/12/2014 Lp trnh hng i tng 4
-
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.
05/12/2014 Lp trnh hng i tng 5
-
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
05/12/2014 Lp trnh hng i tng 6
C hai cch gii quyt vn : - Vng chn kiu - Phng thc o
-
V d
05/12/2014 Lp trnh hng i tng 7
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
05/12/2014 Lp trnh hng i tng 8
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
05/12/2014 Lp trnh hng i tng 9
class NuSinh : public SinhVien
{
public:
NuSinh( char *ht, char *ms, int ns) : SinhVien(ht,ms,ns) {
}
void An() const
{
cout
-
V d
05/12/2014 Lp trnh hng i tng 10
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
05/12/2014 Lp trnh hng i tng 11
void XuatDs(int n, Nguoi *an[ ])
{
for (int i = 0; i < n; i++)
{
an[i] Xuat();
cout
-
V d
05/12/2014 Lp trnh hng i tng 12
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 1960
-
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.
05/12/2014 Lp trnh hng i tng 13
-
Dng vng chn kiu V d
05/12/2014 Lp trnh hng i tng 14
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
05/12/2014 Lp trnh hng i tng 15
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
05/12/2014 Lp trnh hng i tng 16
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
05/12/2014 Lp trnh hng i tng 17
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
05/12/2014 Lp trnh hng i tng 18
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
-
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.
05/12/2014 Lp trnh hng i tng 19
-
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);
05/12/2014 Lp trnh hng i tng 20
-
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
05/12/2014 Lp trnh hng i tng 21
-
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.
05/12/2014 Lp trnh hng i tng 22
-
Phng thc o V d
05/12/2014 Lp trnh hng i tng 23
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.
05/12/2014 Lp trnh hng i tng 24
-
Thm lp con mi V d
05/12/2014 Lp trnh hng i tng 25
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.
05/12/2014 Lp trnh hng i tng 26
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.
05/12/2014 Lp trnh hng i tng 27
-
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 nh ngha li phng thc
o th s gi phng thc lp c s (gn
nht c nh ngha).
05/12/2014 Lp trnh hng i tng 28
-
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. 05/12/2014 Lp trnh hng i tng 29
-
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.
05/12/2014 Lp trnh hng i tng 30
-
Cc c trng ca phng thc o
Phng thc o khng th l cc hm thnh vin
tnh.
Mt phng thc o c th c khai bo l
friend trong mt lp khc nhng cc hm friend
ca lp th khng th l phng thc o.
Khng cn thit phi ghi r t kha virtual khi
nh ngha mt phng thc o trong lp dn
xut ( cng chng nh hng g).
05/12/2014 Lp trnh hng i tng 31
-
Cc c trng ca phng thc o
s kt ni ng c thc hin thch hp cho
tng lp dc theo cy ph h, mt khi phng
thc no c xc nh l o, t lp c s
n cc lp dn xut u phi /n thng nht.
Nu i vi phng thc o lp dn xut,
chng ta li s sut nh ngha cc tham s khc
i mt cht th trnh bin dch s xem l
phng thc khc. y chnh l iu kin kt
ni ng. 05/12/2014 Lp trnh hng i tng 32
-
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
05/12/2014 Lp trnh hng i tng 33
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];
}
-
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.
05/12/2014 Lp trnh hng i tng 34
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 {//}
};
-
Phng thc thun o v 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.
05/12/2014 Lp trnh hng i tng 35
-
Phng thc thun o v 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.
05/12/2014 Lp trnh hng i tng 36
-
Phng thc thun o v 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.
05/12/2014 Lp trnh hng i tng 37
-
Phng thc thun o v 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
05/12/2014 Lp trnh hng i tng 38
-
V d
05/12/2014 Lp trnh hng i tng 39
Shape
virtual void draw()
Circle
public void draw()
Triangle
public void draw()
class Shape //Abstract { public : //Pure virtual Function virtual void draw() = 0; }
-
V d
05/12/2014 Lp trnh hng i tng 40
class Circle : public Shape { //No draw() - Abstract public: 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 *200.000 + Tr Cp
05/12/2014 Lp trnh hng i tng 41
-
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.
05/12/2014 Lp trnh hng i tng 42
-
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.
05/12/2014 Lp trnh hng i tng 43
-
Q & A