OOP Chuong6

download OOP Chuong6

of 42

description

Lý thuyết OOP

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