1 / 24

Objektno orijentisano programiranje

Objektno orijentisano programiranje. Polimorfizam. Polimorfizam. Pojam polimorfizma Virtuelne funkcije Apstraktne klase. Polimorfizam. Osobina objekta izvedene klase da izvršava operacije na način specifičan za izvedenu klasu, iako mu se pristupa kao objektu osnovne klase

silver
Télécharger la présentation

Objektno orijentisano programiranje

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Objektno orijentisano programiranje Polimorfizam

  2. Polimorfizam • Pojam polimorfizma • Virtuelne funkcije • Apstraktne klase

  3. Polimorfizam • Osobina objekta izvedene klase da izvršava operacije na način specifičan za izvedenu klasu, iako mu se pristupa kao objektu osnovne klase • U programu se dinamički odlučuje o kojoj izvedenoj klasi se radi • Poziva se odgovarajuća metoda izvedene klase • Potrebno je da se u osnovnoj klasi metoda definiše kao virtuelna, a u izvedenoj da se redefiniše tako da implementira specifičnu funkcionalnost za tu izvedenu klasu

  4. Polimorfizam Figura Krug Kvadrat Trapez Elipsa voiddrawFigures () {for (int i=0; i< NoFig; i++)FigArray[i]->draw();}

  5. Virtuelne funkcije • Funkcije članice osnovne klase koje se u izvedenim klasama mogu redefinisati, a ponašaju se polimorfno, nazivaju se virtuelne funkcije (engl. virtual functions). • Virtuelna funkcija se u osnovnoj klasi deklariše pomoću ključne riječi virtual na početku deklaracije. • Prilikom deklarisanja virtuelnih funkcija u izvedenim klasama ne mora se stavljati riječ virtual. • Pozivom preko pokazivača na osnovnu klasu izvršava se ona funkcija koja pripada klasi pokazanog objekta.

  6. Virtuelne funkcije class ClanBiblioteke {protected: Racun r;public:virtualint platiClanarinu () //virtuelna funkcija osnovne klase { return r-=CLANARINA; }}; class PocasniClan : public ClanBiblioteke {public:int platiClanarinu () { return r; } //virtuelna funkcija izvedene klase}; void main () { ClanBiblioteke *clanovi[100]; //...for (int i=0; i<brojClanova; i++) cout<<clanovi[i]->platiClanarinu();}

  7. Pozivi virtuelnih funkcija class Osnovna { public: virtual void f(); }; class Izvedena : public Osnovna { public: void f(); } void g1(Osnovna b) { b.f(); } void g2(Osnovna *pb) { pb->f(); } void g3(Osnovna &rb) { rb.f(); } void main () {Izvedena d;g1(d); // poziva se Osnovna::fg2(&d); // poziva se Izvedena::fg3(d); // poziva se Izvedena::fOsnovna *pb=new Izvedena; pb->f(); // poziva se Izvedena::fOsnovna &rb=d; rb.f(); // poziva se Izvedena::f Osnovna b=d; b.f(); // poziva se Osnovna::fdelete pb; pb=&b; pb->f(); // poziva se Osnovna::f } • Virtuelni mehanizam se aktivira samo ako se objektu pristupa preko reference ili pokazivača.

  8. Dinamičko vezivanje • Mehanizam koji obezbjeđuje da se funkcija koja se poziva određuje po tipu objekta, a ne po tipu pokazivača ili reference na taj objekat, naziva se dinamičko vezivanje. • Odlučivanje koja će se virtuelna funkcija pozvati obavlja se u toku izvršavanja programa - dinamički. • Bitna je razlika u odnosu na mehanizam preklapanja imena funkcija koji je statički.

  9. Definisanje virtuelnih funkcija • Virtuelna funkcija osnovne klase ne mora da se redefiniše u svakoj izvedenoj klasi; tada važi funkcija iz osnovne klase. • Deklaracija virtuelne funkcije u izvedenoj klasi mora da se potpuno slaže sa deklaracijom iste u osnovnoj klasi. • Ako se u izvedenoj klasi deklariše neka funkcija koja ima isto ime kao i virtuelna funkcija iz osnovne klase, ali različit broj i/ili tipove argumenata, onda ona sakriva sve ostale funkcije sa istim imenom iz osnovne klase. U izvedenoj klasi treba ponovo definisati sve ostale funkcije sa tim imenom. • Nije dobro da izvedena klasa sadrži samo neke funkcije iz osnovne klase, ne radi se o pravom nasljeđivanju. • Virtuelne funkcije moraju biti nestatičke članice svojih klasa.

  10. Čiste virtuelne funkcije (C++) • Virtuelna funkcija koja nije definisana za osnovnu klasu naziva se čistom virtuelnom funkcijom. • Deklaracija čiste virtuelne funkcije u osnovnoj klasi sadrži =0 umjesto tijela. virtual void cvf () =0;

  11. Apstraktne klase (C++) • Klasa koja sadrži bar jednu čistu virtuelnu funkciju naziva se apstraktnom klasom • Apstraktna klasa ne može imati instance (objekte), već se iz nje samo mogu izvoditi druge klase. • Mogu da se formiraju pokazivači i reference na apstraktnu klasu. • Pokazivači i reference na apstraktnu klasu mogu da ukazuju samo na objekte izvedenih konkretnih klasa. • Apstraktna klasa predstavlja samo generalizaciju izvedenih klasa. • Ako se u izvedenoj klasi ne navede definicija neke čiste virtuelne funkcije iz osnovne klase, i ova izvedena klasa je takođe apstraktna.

  12. Virtuelne funkcije –C++ primjer class Osnovna {public:virtual void cvf () =0; // cista virtuelna funkcijavirtual void vf (); // obicna virtuelna funkcija};class Izvedena : public Osnovna {public:void cvf();};void main () { Izvedena izv, *pi=&izv; Osnovna osn; // ! GRESKA: Osnovna je apstraktna klasa Osnovna *po=&izv; po->cvf(); // poziva se Izvedena::cvf() po->vf(); // poziva se Osnovna::vf()}

  13. Virtuelni destruktor (C++) • Konstruktor ne može biti virtuelna funkcija (jer se poziva prije nego što se objekat kreira) • Destruktor može biti virtuelna funkcija. • Ako je destruktor virtuelna funkcija, tek u vrijeme izvršenja se odlučuje koji destruktor se poziva. • Destruktor osnovne klase se uvijek izvršava (ili kao jedini ili poslije destruktora izvedene klase). • Kada neka klasa ima neku virtuelnu funkciju, vjerovatno i njen destruktor (ako ga ima) treba da bude virtuelan. • Unutar destruktora izvedene klase ne treba pozivati destruktor osnovne klase (on se implicitno poziva).

  14. Definisanje virtuelnih metoda (C#) • Virtuelne metodesu polimorfne class Token { ... public int LineNumber( ) { ... } public virtual string Name( ) { ... } }

  15. Rad sa virtuelnim metodama • Da bi se koristile virtuelne metode: • Ne mogu biti deklarisane kao statičke • Ne mogu biti deklarisane kao privatne

  16. Predefinisanje metoda (C#) • Sintaksa: koristi se ključna riječoverride class Token { ... public virtual string Name( ) { ... } } class CommentToken: Token { ... public override string Name( ) { ... } }

  17. Rad sa predefinisanimmetodama • Moguće je predefinisati samo identične naslijeđene virtuelne metode • Predefinisana metoda mora se potpuno poklapati sa virtuelnom • Može se predefinisati već predefinisana metoda • Predefinisana metoda se ne može eksplicitno deklarisati kao virtuelna • Predefinisana metoda ne može biti statička ili privatna class Token { ... public int LineNumber( ) { ... } public virtual string Name( ) { ... } } class CommentToken: Token { ... public override int LineNumber( ) { ... } public override string Name( ) { ... } } û 

  18. Operatornew za skrivanje metoda class Token { ... public int LineNumber( ) { ... } } class CommentToken: Token { ... new public int LineNumber( ) { ... } }

  19. Operator new za skrivanje metoda • Skrivaju se virtuelne i nevirtuelne metode • Skrivaju se metode sa identičnim potpisima class Token { ... public int LineNumber( ) { ... } public virtual string Name( ) { ... } } class CommentToken: Token { ... new public int LineNumber( ) { ... } public override string Name( ) { ... } }

  20. Gdje su greške? class Base { public void Alpha( ) { ... } public virtual void Beta( ) { ... } public virtual void Gamma(int i) { ... } public virtual void Delta( ) { ... } private virtual void Epsilon( ) { ... } } class Derived: Base { public override void Alpha( ) { ... } protected override void Beta( ) { ... } public override void Gamma(double d) { ... } public override int Delta( ) { ... } }

  21. Definicija apstraktnih klasa (C#) • Ključna riječ abstract abstract class Token { ... } class Test { static void Main( ) { new Token( ); } } Token { abstract } û Ne može se kreirati instanca apstraktne klase

  22. Implementacija apstraktnih metoda • Samo u apstraktnim klasama mogu se deklarisati apstraktne metode • Apstraktne metode nemaju tijelo, odnosno implementaciju u apstraktnoj klasi abstract class Token { public virtual string Name( ) { ... } public abstract int Length( ); } class CommentToken: Token { public override string Name( ) { ... } public override int Length( ) { ... } }

  23. Apstraktne metode • Apstraktne metodesu virtuelne • Predefinisane metode mogu predefinisati apstraktne metode u izvedenim klasama • Apstraktne metode mogu predefinisati metode osnovne klase označene kao virtuelne • Apstraktne metodemogu predefinisati metode osnovne klase označene kao predefinisane (override)

  24. Gdje su greške? class First { public abstract void Method( ); } abstract class Second { public abstract void Method( ) { } } interface IThird { void Method( ); } abstract class Third: IThird { }

More Related