1 / 31

Objektorienterad programmering

Fordon. Tåg. Båt. Bil. Flygplan. Objektorienterad programmering. OOP = objektbaserad programmering + arv. Drawable. Persistent. position bitmap. storage_file_name object_id. rita() flytta(). save() restore(). Box. Cirkel. Linje. bredd hojd. end_a end_b. centrum radie.

Télécharger la présentation

Objektorienterad programmering

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. Fordon Tåg Båt Bil Flygplan Objektorienterad programmering OOP = objektbaserad programmering + arv CD5250 OOP med C++ Mats Medin MDH/IDT

  2. Drawable Persistent position bitmap storage_file_name object_id rita() flytta() save() restore() Box Cirkel Linje bredd hojd end_a end_b centrum radie Bilregpost agare marke regnr besiktigad() skattad() Bankkonto agare saldo satt_in(summa) ta_ut(summa) Text_Box Pil text font riktning byt_ riktning() Exempel på arv CD5250 OOP med C++ Mats Medin MDH/IDT

  3. Arv innebär • “Underklassen” kan göra det som “överklassen” gör + det vi själva bestämmer att den ska kunna dessutom • Underklassen håller samma data som överklassen + det den behöver för sitt eget tillagda beteende • Olika underklasser kan göra samma sak på olika sätt CD5250 OOP med C++ Mats Medin MDH/IDT

  4. Arv innebär forts • Underklassens beteende är mer specialiserat • Överklassens beteende är mer generellt • Klasser som är mycket generaliserade har vi ingen nytta av att instansiera - abstrakta överklasser CD5250 OOP med C++ Mats Medin MDH/IDT

  5. Att jobba med arv • Oftast börjar man med att hitta de objekt man behöver - och deras klasser • Sen letar man rätt på beteende som är gemensamt för flera klasser • bryts ut till överklass • Man tittar också efter existerande klasser man kan använda CD5250 OOP med C++ Mats Medin MDH/IDT

  6. Överklassens privata data kan inte underklassens metoder komma åt • Metoder som är implementerade i överklassen kommer dock åt dem CD5250 OOP med C++ Mats Medin MDH/IDT

  7. Synligt (public) arv - arv av interface class Box : public Drawable {/* metoder och data */} Box-klassens anropssnitt erbjuder även metoderna rita() och flytta() som definierats i överklassen Drawable (jfr sid 1. rita() och flytta() är givetvis public:) Även implementationen ärvs - om inte... CD5250 OOP med C++ Mats Medin MDH/IDT

  8. Synligt (public) arv - arv av interface forts class Bankkonto : public Persistent {/* metoder och data */} Bankkonto -klassens anropssnitt erbjuder även metoderna save() och restore() som definierats i överklassen Persistent (jfr sid 1. save() och restore() är givetvis public:) Även implementationen ärvs - om inte... CD5250 OOP med C++ Mats Medin MDH/IDT

  9. Om inte... Överklassen Drawable vet inte hur en Box eller Cirkel ser ut, bara att det ska gå att rita den - alltså får draw() implementeras i Box, Cirkel, Linje,... • Drawable::rita() är en pure virtual function • Enbart anropssnitt (interface) ärvs för metoden draw() • Drawable kan inte instansieras - - Drawable är en abstrakt överklass CD5250 OOP med C++ Mats Medin MDH/IDT

  10. ! Ett statiskt allokerat objekt • Har plats för de medlemsdata som finns i dess typ - varken mer eller mindre Alltså är överklass-objektets lagringsutrymme mindre än underklassobjektet Slicing – konstruktionsfel på språket C++? Pekare eller referenser måste användas i C++ OOP! CD5250 OOP med C++ Mats Medin MDH/IDT

  11. Linje* Pil* Box* Cirkel* Text_Box* adasd dfasfas sfdsfd Exempel: Drawables • Gör en sekvens av grafikobjekt av olikasubtyp - Box, Cirkel, Linje, etc. som ska ritas på skärmen Vi kan inte allokera statiskt, objekten måste hanteras via pekare eller referenser (varför var det så?) CD5250 OOP med C++ Mats Medin MDH/IDT

  12. Exempel: Drawables forts Jag trodde att typkontrollen skulle sätta stopp för det där! List <Drawable> ritlista; // template <class Type> // class List //... List::stoppaIn(Type *elem); ritlista.stoppaIn(minOrangeBox); ritlista.stoppaIn(mingroenaCirkel); ritlista.stoppaIn(mittStreck); CD5250 OOP med C++ Mats Medin MDH/IDT

  13. Konvertering subtyp supertyp Konvertering från subtyp till supertyp är tillåtet - sker automatiskt (implicit) vid behov! Nödvändigt för att OOP ska fungera. (Glöm inte: pekare/referenser, annars slicing) CD5250 OOP med C++ Mats Medin MDH/IDT

  14. Public inheritance - synligt arv • public members (synliga medlemmar) i överklassen blir public (synliga) i underklassen • Protected members (skyddade medlemmar) i överklassen blir protected (skyddade) i underklassen • (privata medlemmar i överklassen kommer man inte åt alls från underklassen) CD5250 OOP med C++ Mats Medin MDH/IDT

  15. Protected inheritance - skyddat arv • public members (synliga medlemmar) och protected members (skyddade medlemmar) i överklassen blir protected (skyddade) i underklassen • (privata medlemmar i överklassen kommer man inte åt alls från underklassen) CD5250 OOP med C++ Mats Medin MDH/IDT

  16. Private inheritance - privat arv • public members (synliga medlemmar) och protected members (skyddade medlemmar) i överklassen blir private (privata) i underklassen • (privata medlemmar i överklassen kommer man inte åt alls från underklassen) CD5250 OOP med C++ Mats Medin MDH/IDT

  17. i överklass typ av arv i underklass public public public protected public protected private public ej åtkomlig public protected protected protected protected protected private protected ej åtkomlig public private private protected private private private private ej åtkomlig CD5250 OOP med C++ Mats Medin MDH/IDT

  18. Drawable Persistent position bitmap storage_file_name object_id Box Cirkel Linje bredd hojd end_a end_b centrum radie Bilregpost agare marke regnr Bankkonto agare saldo Text_Box Pil text font riktning Hur är arv implementerat? CD5250 OOP med C++ Mats Medin MDH/IDT

  19. Implementation av arv Cirkel mincirkel; position bitmap datamedlemmar från basklassen centrum radie underklass-specifika datamedlemmar CD5250 OOP med C++ Mats Medin MDH/IDT

  20. Vad ärvs? • medlemsfunktioner ärvs • medlemsdata ärvs • friends (vänner) ärvs inte • konstruktor ärvs inte • basklassens konstruktor anropas, vanligen från initieringslistan för att sätta rätt värden i basklassdelen • en nivå upp kan man anropa CD5250 OOP med C++ Mats Medin MDH/IDT

  21. MyBaseClass protected: int x; A myaobj1; A myaobj2; B mybobj; SubClassB x x x SubClassA Åtkomst av överklassmedlemmar doIt() ? doIt() CD5250 OOP med C++ Mats Medin MDH/IDT

  22. Virtuell funktion Komma åt subtyp-specifik implementation av virtuella funktionsanrop från bastypen • Nödvändigt för att OOP ska fungera. • den virtuella hanteringen fungerar bara om objektet hanteras via pekare eller referens • statiskt allokerat objekt ÄR av den statiska typen CD5250 OOP med C++ Mats Medin MDH/IDT

  23. Myclass::print(ostream &) Myclass::draw() Myclass::~Myclass() Implementation av objekt med statiska och virtuella metoder type_info för Myclass int x float f _vptr_Myclass Virtual table för Myclass static int Myclass::noOfObjs static int Myclass::getNoOfObjs() int Myclass::get_x() Virtuella metoder nås via vptr CD5250 OOP med C++ Mats Medin MDH/IDT

  24. Pure virtual function Definierar (en del av) ett snitt utan att implementera det class Drawable { virtual void draw() = 0; virtual void draw() = 0; ... “= 0”markerar pure virtual function CD5250 OOP med C++ Mats Medin MDH/IDT

  25. Abstrakt överklass En klass med en eller flera pure virtual functions är en abstrakt överklass. En klass med bara pure virtual functions (dvs ingen funktion är implementerad i den) är en rent abstrakt överklass. Syftet med den är bara att specificera ett snitt som underklasserna ska tillhandahålla CD5250 OOP med C++ Mats Medin MDH/IDT

  26. Arv av beteende Synligt arv • Ger även arv av implementation • utom då man jobbar med pure virtual function/rent abstrakta överklasser CD5250 OOP med C++ Mats Medin MDH/IDT

  27. Arv av implementation Privat eller skyddat arv Stack teststack; teststack.push(x); teststack.push(y); t=teststack.pop(); class Stack : private Vector { public: push(Elem e) {/* peta i vektorn */} Elem pop() { /* peta i vektorn */} } Vad händer om man använder public inheritance istället? Vi får ett väldigt fult anropssnitt! t=teststack[10]; teststack.push_back(e); CD5250 OOP med C++ Mats Medin MDH/IDT

  28. ...men en stack är inte en vektor Snyggare, renare, med en vektor som beståndsdel i stället för arv: class Stack { public: push(Elem e) { theStack.pushBack(e); } Elem pop() { /* ... */ } private: Vector theStack; } CD5250 OOP med C++ Mats Medin MDH/IDT

  29. Konstruktor-destruktor och arv När ett objekt skapas sker följande: 1. Konstruktorn för ev. överklass anropas alltid först. 2. Konstruktorerna för den aktuella klassens datamedlemmar anropas 3. Satserna i den aktuella klassens konstruktor exekveras. När ett objekt tas bort sker följande: 1. Satserna i den aktuella klassens destruktor exekveras. 2. Destruktorerna för den aktuella klassens datamedlemmar anropas 3. Destruktorn för ev. överklass anropas. CD5250 OOP med C++ Mats Medin MDH/IDT

  30. Drawable position bitmap rita() flytta() Box Cirkel Linje bredd hojd end_a end_b centrum radie Text_Box Pil text font riktning byt_ riktning() skydda konstruktorn på abstrakt överklass class Drawable { protected: Drawable(); ….. Varför inte private? CD5250 OOP med C++ Mats Medin MDH/IDT

  31. Linje* Pil* Box* Cirkel* Text_Box* adasd dfasfas sfdsfd Virtuell destruktor delete drawable_ptr; Delete genom basklass-pekare tar bara bort basklass-objekt-delen om inte destruktorn är virtual! Är protected basklass- destruktor en bra ide? CD5250 OOP med C++ Mats Medin MDH/IDT

More Related