44
CHƯƠNG 7. TÍNH ĐA HÌNH ThS. Trần Anh Dũng

Chuong 07 - Tinh Da Hinh

Embed Size (px)

Citation preview

  • 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