Objektorienterad programmering sid. 1 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering + arv Fordon TågBåtBil Flygplan
Objektorienterad programmering sid. 2 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Exempel på arv Drawable rita() flytta() position bitmap Persistent save() restore() storage_file_name object_id Box bredd hojd Text_Box text font Cirkel centrum radie Linje end_a end_b Pil riktning byt_ riktning() Bankkonto agare saldo satt_in(summa) ta_ut(summa) Bilregpost agare marke regnr besiktigad() skattad()
Objektorienterad programmering sid. 3 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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
Objektorienterad programmering sid. 4 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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
Objektorienterad programmering sid. 5 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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
Objektorienterad programmering sid. 6 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överklassens privata data kan inte underklassens metoder komma åt Metoder som är implementerade i överklassen kommer dock åt dem
Objektorienterad programmering sid. 7 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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...
Objektorienterad programmering sid. 8 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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...
Objektorienterad programmering sid. 9 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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
Objektorienterad programmering sid. 10 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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
Objektorienterad programmering sid. 11 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Exempel: Drawables Gör en sekvens av grafikobjekt av olika subtyp - 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å?) adasd dfasfas sfdsfd Box*Cirkel* Pil* Linje* Text_Box*
Objektorienterad programmering sid. 12 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Exempel: Drawables forts List ritlista; // template // class List //... List::stoppaIn(Type *elem); ritlista.stoppaIn(minOrangeBox); ritlista.stoppaIn(mingroenaCirkel); ritlista.stoppaIn(mittStreck); Jag trodde att typkontrollen skulle sätta stopp för det där!
Objektorienterad programmering sid. 13 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Konvertering subtyp supertyp Konvertering från subtyp till supertyp är tillåtet - sker automatiskt (implicit) vid behov! Konvertering från supertyp till subtyp görs med dynamic_cast
Objektorienterad programmering sid. 14 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT dynamic_cast med pekare Behövs t.ex. för att anropa medlemsfunktion som inte finns i “överklassen”: Drawable *mittRitobjekt = hamtaNastaObj; Pil *pp = dynamic_cast (mittRitobjekt); if (pp) // Det var en pil, konvertering lyckades! pp->byt_riktning(); Objektets dynamiska typ är känd men för medlemsåtkomst används den statiska typen. :-(:-(
Objektorienterad programmering sid. 15 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT dynamic_cast med referens Exempel: anropa subtypens medlemsfunktioner på ett objekt utpekat av “supertypreferens”: Drawable &mittRitobjekt = hamtaNastaObj; try { Pil &pp = dynamic_cast (mittRitobjekt); pp->byt_riktning(); } catch (std::bad_cast) { /* Det var inte en pil */}
Objektorienterad programmering sid. 16 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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)
Objektorienterad programmering sid. 17 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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)
Objektorienterad programmering sid. 18 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT 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)
Objektorienterad programmering sid. 19 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT i överklasstyp av arvi underklass publicpublicpublic protected public protected privatepublicej åtkomlig publicprotected protected protectedprotected protected privateprotected ej åtkomlig publicprivate private protectedprivate private privateprivate ej åtkomlig