Föreläsning 4. Arv – bakgrund (kap. 9) Hund pälsfärg favoritben smutsa_ned() ät_katt() Katt pälsfärg smutsa_ned() klös_soffa() Kanin pälsfärg slaktvikt.

Slides:



Advertisements
Liknande presentationer
Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Advertisements

Fortsättningskurs i Programmering lektion 6
Klassarv och inkapsling
Repetition av objektorientering
OOP Objekt-orienterad programmering
Föreläsning 1.
Metoder i java Det finns två typer av metoder i java
Arv.
Abstract & sealed.
Inkapsling.
Välkommen Vahid Mosavat
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Programkodens uppbyggnad
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
Alice in Action with Java
i olika programmeringsspråk
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektbaserad programmering –Grundläggande om klasser och objekt – (Arv får vänta)  Iden med klasser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Objektorienterad programmering i Java
Programmering i C# 3. Klasser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT Lite OOA/OOD.
Föreläsning 5. Problemet Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism) class Bil : public.
Sid 41 Fordon int antalhjul; int vikt;
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
4. Arv och dynamisk bindning
Polymorfism.
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Arv.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Multipelt arv Drawable draw() move() position bitmap Persistent save() restore() storage_file_name.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Föreläsning 8 Arv och abstrakta klasser. Arv Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda klassen ( extends.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning 8 Programmeringsteknik och Matlab DD1312 Klassmetoder Egen modul, Self Metoderna: __str__, __lt__,… Meddelande Arv, Överlagring av metoder,
Föreläsning 9 Gränssnitt. Super Super kan användas till anrop av en omdefinierad metod Super kan användas till anrop av konstruktorer i superklassen Super.
Föreläsning 1. Innehåll Introduktion till objektorientering –OOP (objektorienterad programmering) –Objekt, instanser, klasser C++ –OO i C++ –Standardbibliotek.
Föreläsning 4 Klasser Och Objekt.
Objektorienterad programmering i Java
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
Objektorienterad programmering
Föreläsning 2. Allmänt STL genererar varningar i Visual C++ –”#pragma warning (disable : 4786)”
Föreläsning 9 Arv kap 8.1 Interface kap 9.2 Grafiska användargränssnitt (GUI) kap 10.
Arv repetition Arv = Är relation Tillgänglighet public, protected och private. Överklass ös Direkt härledd underklass dhu: Class dhu : public ös{} Indirekt.
7. Delegerare och notifierare
Föreläsning 17 Repetition. Källkodsformat Unicode används åäöμψζ tillåtna i namn på identifierare Inte alla miljöer klarar av det Källkod Bytekod Java.
Objekt, Klass och Instans Analys av systemet ger mer eller mindre detaljerade objekt Objekten sorteras och klass-diagram ritas upp där relationer reds.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Föreläsning 5 Objekt Klasser Konstruktorer Metoder Minnesbilder av objekt.
Programmeringsteknik för K och Media
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Funktionsmall template void myfunc(Type * arr, int n) { // kod; // objekt av typ Type kan deklareras.
Föreläsning 5 Klasser och instanser
OOP - teori1 OOP del II– Föreläsning 5 vecka 6. OOP - teori2 Klasser Substantiv i singularis stavat med stor bokstav till exempel Human Dog Account Circle.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
OOP&M - teori1 OOP&M del II– Föreläsning 5 vecka 50 OBJEKT Substantiv i singularis stavat med stor bokstav till exempel Human Dog Account Circle Book String.
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer.
Objektbaserad programmering sid. 1 6/30/2015CD5250 OOP med C++ Mats Medin MDH/IDT Objektbaserad programmering –Grundläggande om klasser och objekt – (Arv.
OOP&M - teori1 OOPM del II – Föreläsning vecka Sista föreläsning del II Kapitel 21 plus paket Abstrakta klasser/metoder igen Gränssnitt/Interface.
Arv, abstrakta klasser och gränssnitt
OOP&M - teori1 OOPM del II– Föreläsning vecka Mer om ärvning.. Abstrakta klasser/metoder Gränssnitt/Interface klasser.
OOP&M - teori1 OOPM del II – Föreläsning vecka Abstrakta klasser/metoder igen Gränssnitt/Interface klasser igen tillämpat.
Objektorienterad programmering sid. 1 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering.
Föreläsning 3. Klasser class namn { public: deklarationer av synliga medlemsfunktioner och datamedlemmar protected: private: deklarationer av gömda medlemsfunktioner.
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder.
TDP004 Objektorienterad Programmering Fö 6 Objektorientering forts.
TDP004 Objektorienterad Programmering Fö 8 Sammanfattning
Objektorienterad programmering forts
Presentationens avskrift:

Föreläsning 4

Arv – bakgrund (kap. 9) Hund pälsfärg favoritben smutsa_ned() ät_katt() Katt pälsfärg smutsa_ned() klös_soffa() Kanin pälsfärg slaktvikt smutsa_ned()

Arv – bakgrund Många klasser delar på egenskaper och beteende Det framstår onödigt att återskapa samma saker om och om igen C++ erbjuder verktyg för att samla ihop gemensamma egenskaper och beteenden i överklasser

Problemlösningsmetodik Börja med att identifiera alla klasser som behövs Leta sedan efter beteenden som är gemensamma för flera klasser –Bryt ut i en överklass Kontrollera även om det redan finns passande klasser

Lösning Husdjur pälsfärg smutsa ned() Katt klösSoffa() Kanin slaktvikt Hund favoritben ät katt()

Implikationer av arv Underklassen är en utökad variant av överklassen Underklassen klarar minst allt vad överklassen klarar, oftast mer Underklassen innehåller garanterat all den data som finns i överklassen, dessutom kan extra data finnas

Implikationer av arv Underklassens beteende är mer specialiserat Överklassens beteende är mer generellt Klasser som är mycket generaliserade är ofta abstrakta och kan inte instansieras –Husdjur –Fordon

Vad ärvs? Medlemsfunktioner ärvs Datamedlemmar ärvs Friends (vänner) ärvs inte Konstruktor ärvs inte –Basklassens (överklassen) konstruktor anropas via initieringslistan

Fordon class Fordon { public: Fordon(Person & owner) : m_owner(owner) {} Point GetPosition() { return m_position; } Person & GetOwner() { return m_owner; } protected: Point m_position; Person & m_owner; }; // Fordon initierar owner & position i sin // initieringslista Fordon(Person & owner) : m_position(10,5), m_owner(owner) { }

Bil ärver från Fordon // Ärver från Fordon class Bil : public Fordon { public: Bil(Person & owner); void TurnWheel(float wheel); protected: float m_wheelpos; } // Bilkonstruktorn anropar överklassens konstr. // OBS likheten med initieringslista av variabler Bil::Bil(Person & owner) : Fordon(owner) { m_wheelpos = 0; }

Alltså är en Bil ett Fordon // vi kommer åt alla Fordons medlemsvariabler void Bil::TurnWheel(float wheel) { m_wheelpos = wheel; int x = GetPosition().GetX(); // vi kan använda m_owner som är deklarerad // i klassen Fordon cout << ”Bilen med ägare ” << m_owner.Name() << ” svänger med ratten” << endl; }

Motorcykel ärver från Fordon // Ärver från Fordon class Motorcykel : public Fordon { public: Motorcykel(Person & owner); void SetColor(int color) { m_color = color; } int GetColor() { return m_color; } protected: int m_color; } // Konstruktorn anropar överklassens Fordon. Motorcykel::Motorcykel(Person & owner) : Fordon(owner) { m_color = 0; }

Gemensamt mellan Motorcykel och Bil Motorcykel och bil har endast Fordon gemensamt Inga andra egenskaper delas mellan objekten Klasser byggs upp i trädstruktur Underklasser är mer specialiserade Underklasserna erbjuder samma gränssnitt som överklasserna

Metodersättning En underklass kan ersätta en metod i överklassen genom att definiera om den i underklassen Överklassens ursprungliga metod kan anropas från underklassen med operatorn :: –Exempel: Fordon::GetPosition()

Synligt arv (public) (kap. 9.3) Synliga (public) medlemmar i överklassen blir synliga i underklassen Skyddade (protected) medlemmar i överklassen blir skyddade i underklassen Privata (private) medlemmar i överklassen kommer man inte åt från underklassen

Skyddat arv (protected) Synliga (public) medlemmar i överklassen blir skyddade (protected) i underklassen Skyddade (protected) medlemmar i överklassen blir skyddade i underklassen Privata (private) medlemmar i överklassen kommer man inte åt från underklassen

Privat arv (private) Synliga (public) och Skyddade (protected) medlemmar i överklassen blir privata (private) i underklassen Privata (private) medlemmar i överklassen kommer man inte åt från underklassen

Tillgänglighet – översikt 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

Minneslayout Fordon Person & ägare Point position Bil Person & ägare Point position float wheelpos Motorcykel Person & ägare Point position int color Nya datamedlemmar läggs till i slutet av klassen, ärvda medlemmar ligger alltid på samma offset i minnet

Statisk allokering Ett statiskt allokerat objekt har en bestämd storlek reserverat i minnet Ett underklass-objekt kräver mer lagringsutrymme än överklassobjekten för att få rum med de extra datamedlemmarna Slicing – uppstår om ett objekt av en överklass tilldelas ett objekt av en underklass –All data i underklassen får inte rum, och förkastas därför –Undvik genom att använda pekare eller referenser !

Exempel (slicing) Person owner(”kalle”); Bil b(owner); Fordon f = b; // SLICING!!! Fordon &f = *b; // OK

Exempel (tillgänglighet vid arv) class Stack : private Vector { public: void push(Elem e) {/* peta i vektorn */} Elem pop() {/* peta i vektorn */} }; class Stack : private Vector { public: void push(Elem e) {/* peta i vektorn */} Elem pop() {/* peta i vektorn */} }; // main... Stack s; Elem e,e1,e2; … s.push(e1); s.push(e2); e=teststack.pop(); // main... Stack s; Elem e,e1,e2; … s.push(e1); s.push(e2); e=teststack.pop(); Vi får ett väldigt fult anropssnitt! t=teststack[10]; teststack.push_back(e); Privat eller skyddat arv Vad händer om man använder public inheritance istället?

…en stack är inte en vektor Snyggare och bättre med en vektor som beståndsdel (aggregat) istället för arv class Stack { public: push(Elem e) { theStack.pushBack(e); } Elem pop() { /*... */ } private: Vector theStack; }; class Stack { public: push(Elem e) { theStack.pushBack(e); } Elem pop() { /*... */ } private: Vector theStack; };

Konstruktor (kap. 9.2) 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

Konstruktoranrop Konstruktorn för en överklass kan anropas via underklassens konstruktor –Bil::Bil(Person & owner) : Fordon(owner)… Om ingen konstruktor för överklassen specificeras anropas överklassens defaultkonstruktor

Destruktor 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

Konstigheter vid arv Funktionsöverlagring –Metoder deklarerade i en subklass döljer alla metoder med samma namn i basklassen, oavsett vilka parametrar metoderna har

Arv – fördelar (kap. 9.4) Arv kan som vi har sett underlätta programmering genom att olika klasser kan dela på gemensam källkod Arv för även med sig andra fördelar. När ett objekt ärver från en överklass garanterar vi att underklassen klarar allt som överklassen klarar

Användning av arv // skriv ut information om ett fordon void Fordonsinfo(Fordon & fordon) { // alla fordon har en ägare Person & owner = fordon.GetOwner(); cout << ”Fordonet har en ägare vid namn ” << owner.Name(); } Person owner1(”kalle”); Person owner2(”olle”); Bil b(owner1); Motorcykel m(owner2); // vi kan behandla ”m” och ”b” som Fordon Fordonsinfo(b); // skriver ut ”kalle” Fordonsinfo(m); // skriver ut ”olle”

Multipelt arv (kap. 9.10) Klasser kan ärva från mer än en klass För varje klass specificeras om arvet är public, protected eller private Används för att kombinera egenskaper från två eller flera klasser

Exempel (multipelt arv) BilBåt Amfibiebil Amfibiebil ärver alla egenskaper som bil och båt har En Amfibiebil är en Bil och en Båt

Namnkonflikter När klasser ärver från flera överklasser kan namnkonflikter uppstå –Exempel: om både bil och båt har implementerat två metoder som heter ”Print” –Namnkonflikterna löses genom att ersätta metoden ”Print” i underklassen och specificera vilken metod i överklassen som skall anropas. Detta löses med exempelvis ”Bil::Print”. Eventuellt kan bägge överklassernas metoder anropas efter varandra

Exempel (Amfibiebil) class Bil { public: Bil(int age) { m_age = age; } void Print() { cout << ”Bil, årsmodell ” << m_model; } protected: int m_model; }; class Bat { public: Bat(int length) { m_length = length; } void Print() { cout << ”Båt, längd ” << m_length; } protected: int m_length; };

Exempel (Amfibiebil) forts. class Amfibiebil : public Bil, public Bat { public: Amfibiebil(int age, int length) : Bil(age), Bat(length) {} // för att undvika namnkonflikter måste vi // ersätta metoden Print void Print() { // skriv först ut bilinformationen Bil::Print(); // sedan båtinformationen Bat::Print(); } };

Exempel (multipelt arv) Fordon BilBåt Amfibiebil

Konstigheter med multipelt arv Multipelt arv kan medföra problem i vissa fall –Om en klass ärver från två klasser som har en gemensam överklass får underklassen dubblerade data från den gemensamma överklassen –Namnkonflikter uppstår för metoder från den gemensamma överklassen Undvik multipelt arv