TDP004 Objektorienterad Programmering Fö 8 Sammanfattning

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

Klasser och objekt.
Klassarv och inkapsling
OOP Objekt-orienterad programmering
Föreläsning 1.
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 10: Objektorientering Objektorientering och abstrakta datatyper Dynamisk bindning.
ObjektOrienterad analys och design. SVP Vt2009 Föreläsning nr 2, måndag 8 april kl Diskussion (kurshemsida): Om designuppgiften Om projektuppgiften.
Arv.
Abstract & sealed.
Inkapsling.
Polymorfism.
Metoder.
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.
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.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int.
Föreläsning 13 Polymorfism, Paket och JAR-filer. Polymorfism Ordet härstammar från grekiskan Poly – många Morf – form Polymorf – många former Någonting.
Objektorienterad programmering i Java
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Programmering i C# 3. Klasser.
PROCESSPROGRAMMERING
Pekare och speciell programstruktur i inbyggda system
Klasser och objekt Klasser, objekt och instansvariabler
4. Arv och dynamisk bindning
Polymorfism.
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.
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Programmering i C# 5. Structer.
Arv.
Programmeringsteknik för Media1 & K1
1. En infrastruktur för programutveckling
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.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
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 12 Om slutprovet. Repetition –deklaration av variabler –skapande av objekt (instansiering) –Vektorer och Vector-klassen –Klasser –Instans-/klassvariabler.
Föreläsning 4 Klasser Och Objekt.
Objektorienterad programmering
Föreläsning 2. Allmänt STL genererar varningar i Visual C++ –”#pragma warning (disable : 4786)”
1 Föreläsning 8 Mer om klasser och objektorientering.
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.
Lennart Edblom & Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
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 6 Repetition på metoder Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
Ö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 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.
TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder.
TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd.
1 Mer om metoder, variabler, klasser och objekt. Kursboken: - Kapitel 6 - Kapitel 8.
TDP004 Objektorienterad Programmering Fö 5 Minneshantering.
TDP004 Objektorienterad Programmering Fö 6 Objektorientering forts.
Detaljer i exception-hantering
Objektorienterad programmering forts
Presentationens avskrift:

TDP004 Objektorienterad Programmering Fö 8 Sammanfattning

Deklarationer/variabler/konstanter Variabler kan initieras double salary; float distance = 10.542; Konstanter och referenser måste initieras const double pi = 3.14159; int i = 10; int& j = i;

Typkonverteringar Konvertera mellan olika typer med static_cast<till typ>(variabel) Behövs vid tex float a = 7; float b = 4; int c = a / b; // c = 1 pga trunkering! Förväntat resultat fås med: int c = static_cast<float>(a) / static_cast<float>(b);

STL Standard template library. Containrar: Sekventiella: vector, list, string. Associativa: map. Iteratorer (specialiserad pekare): forward- och reverse-iterator. Funktioner: Inbygga funktioner för sortering, sökning, flyttning av element, mm. Alla dessa använder iteratorer.

Översiktlig bild över iteratorer begin() Forward iterator end() … rend() Reverse iterator rbegin()

Objektorientering Klasser Byggstenen inom OO. Åtkomstdeklarationer Public, protected, private. Arv: Privat data/funktioner ärvs aldrig. Polymorfi. Inkapsling. Struct kan ibland vara ett alternativ till class. I en struct är åtkomsten som default public.

Exempel på klass I filen ExampleClass.h: class ExampleClass { public: // Publik åtkomstdeklaration ExampleClass(int defaultID); // Konstruktor ~ExampleClass(); // Destruktor bool SetID(int aID); // Medlemsfunktioner. const int GetID() const; float f(float a, float b, float c) const; private: // Privat åtkomstdeklaration int m_ID; // Klassvariabel. … }; // Observera ; För det mesta definieras funktionerna i .cc/.cpp-filen. Detta är ett exempel på en klass. Klassdeklaration med class klassnamn. Åtkomstdeklarationerna public och private har vi gått igenom tidigare. Vi ser konstruktorn och destruktorn som publika funktioner, samt 3 andra andra publika funktioner SetID, GetID och f. Det finns även en privat medlemsvariabel m_ID som är en int.

Annat exempel på klass struct Position // Används för att spara en position. { double m_X; double m_Y; double m_Z; }; class Character public: Character(Position& aSpawnPos); ~Character(); void MoveToPosition(Position & aPosition); const Position& GetPosition() const; // OK att returnera en referens till en medlemsvariabel. // const gör att mottagaren inte kan ändra värdet. private: Position m_Position;

Åtkomst Med åtkomstdeklarationerna public, protected och private reglerar man åtkomst till klassens data och funktioner för andra klasser. Den egna klassen har alltid obegränsad tillgång. Public – fritt tillgänglig för läs och skriv. Private – ingen tillgänglighet alls. Protected – tillgänglig enbart för subklasser. I class är allt private som default.

Arv public: de ärvda funktionerna/datan behåller den åtkomst de hade i superklassen. protected: de ärvda funktionerna/datan blir protected i subklassen. private: de ärvda funktionerna/datan blir private i subklassen. Den ärvande klassen styr hur andra klasser ska komma åt de ärvda funktionerna. Vi ser att den ärvande klassen till viss del kan påverka hur andra klasser kan få tillgång till de ärvda funktionerna och variablerna, men de kan aldrig bli mera tillgängliga än de var i basklassen. Detta för att behålla abstraktion och inkapsling.

Konstruktor / destruktor Konstruktor skapar objektet Initieringslistor. Behövs för medlemskonstanter och -referenser. Destruktor städar upp efter objektet. Om programmeraren inte skapar en konstruktor/destruktor skapar kompilatorn dessa. Kompilatorgenererad konstruktor använder inte initieringslistor. Virtuell destruktor viktigt vid arv. Kompilatorgenererad destruktor är inte virtuell.

Funktioner, forts. Deklaration, i h-filen: Definition, i cc-filen: returvärde funktionsnamn(…); Definition, i cc-filen: returvärde klassnamn::funktionsnamn(…) { //Implementation } Med const& kan vi förhindra kopiering av datan(mha &) och hindra att funktionen ändrar på datan (mha const). Ex: int max(const int& a, const int& b); Värdet på parametrarna a och b kan nu inte ändras i funktionen max.

Funktioner En funktion gör en sak och bör göra det utan oönskade sidoeffekter. Returvärde void eller annan typ, inbyggd eller egendefinierad. Parameterlistan är den data som funktionen behöver från den anropande funktionen för att utföra beräkningen.

Virtuella funktioner virtual int f(…); En virtuell funktion får (i C++) implementeras i basklassen, men kan överlagras av basklasserna. Virtuella funktioner är grunden för polymorfi. Funktionen implementeras kanske annorlunda i subklasserna än basklassen. Vilken funktion som anropas bestäms vid exekvering (dynamisk/sen bindning).

Shape Shape(double aHeight, double aWidth) { m_height = aHeight; m_Width = aWidth; } virtual double Calculate Area() = 0; Abstrakt basklass. Rectangle double CalculateArea() { return m_height * m_Width; } Triangle double CalculateArea() { return (m_height * m_Width ) / 2.0; } Enkelt klassdiagram. Subklasserna definierar funktionen CalculateArea() på olika sätt. Konstruktorer etc utelämnade. m_height och m_width är medlemsvariabler.

Polymorfism vector<Shape*> shapesVector; Shape* shape1 = new Triangle(…); Shape* shape2 = new Rectangle(…); shapesVector.push_back(shape1); shapesVector.push_back(shape2); shapesVector.push_back(…); Ex 1: for(i = 0; i < shapesVector.size() ; ++i) { cout<< shapesVector[i]->CalculateArea() << ” ”; /* Anropar korrekt CalculateArea(), vi vet inte vilken implementation innan anropet sker. */ } Ex 2: shape1->CalculateArea(); //Anropar CalculateArea() i klassen Triangle. shape2->CalculateArea(); //Anropar CalculateArea() i klassen Rectangle. Fördelen med detta är att vi kan skapa olika Shapes och sedan anropa CalculateArea på dessa Shapes utan att i förväg veta vilken funktion som kommer att exekveras. I exemplet så gör vi just detta och sparar dem i en vector med Shape som element. Sedan itererar vi igenom denna vector och anropar CalculateArea för alla Shapes i vectorn. Korrekt implementation av CalculateArea kommer att anropas, men vi vet inte vilken implementation det är eftersom det kan finnas olika Shape i vectorn.

Polymorfism, forts. Vilken funktion som exekveras vid anrop till CalculateArea() avgörs vid exekveringen, sk dynamisk/sen bindning. En icke-virtuell funktion har sk statisk/tidig bindning: det bestäms vid kompilering vilken funktion som kommer att anropas.

Rent virtuella funktioner virtual int f(…) = 0; Får ej implementeras i basklassen, måste implementeras i subklasserna. En klass med minst en rent virtuell funktion blir en abstrakt klass. Det är omöjligt att skapa en instans av en abstrakt klass.

Multipelt arv En klass kan ärva från flera olika basklasser. Var försiktig med multipelt arv i allmänhet, pga ”diamond pattern”.

virtual f(int a, int b) = 0; C int f(int a, int b) { return (a * b); } B int f(int a, int b) { return (a + b) / 2; } D D* d = new D(); d->f(1, 3); ??? Vad händer då funktionen f anropas i klassen D? Detta utseende i arvshierarkin kallas för ”The diamond pattern”.

Inkapsling Data och beräkningar kapslas in i funktioner och implementationen göms. Den anropande klassen behöver inte veta några detaljer om implementationen. Privat data och publika interface. Inkapsling är ett viktigt koncept inom OO.

static Static-funktioner hör till klassen, kan anropas även om det inte finns någon instans av klassen. Dessa kan enbart anropa andra funktioner som inte tar this som parameter (ex: Init-create från Fö 9). Static-klassvariabler – enbart en upplaga. Initieras utanför alla funktioner. Ex: int ExampleClass::staticVariable = 10; Minne för static medlemsvariabler allokeras enbart en gång.

Pekare, * Objekt som pekar på ett minne. Används bla för dynamisk minneshantering. Ex: int* p1; float* p2; vector<int*> vp; /* vp är en vector som innehåller pekare till int.*/ ExampleClass* myClass = new ExampleClass(); En pekare måste inte, men bör initieras. Man kan kontrollera om en pekare är giltig genom jämförelse med NULL.

Använda pekare Om man har en pekare till ett objekt och vill anropa dess funktioner används notationen: variabelnamn->funktionsnamn(parametrar) Ex: ExampleClass* myClass = new ExampleClass(); myClass->func(1.1, 3.5, 5.7) Läser lokal variabel med liknande syntax. int id = myClass->m_ID; Nu kommer vi till det intressanta, hur man använder pekare. Om vi har en pekare till ett objekt kan vi anropa dess medlemsfunktioner och komma åt dess medlemsvariabler genom notationen ->. Se exemplet på hur det går till.

Referens & Alternativ till pekare. ”A reference is an alias” En referens måste initieras. int i = 1; int& intRef = i; /*intRef refererar nu till variabeln is värde. */ All operationer på en referens är egentligen operationer på den underliggande objektet. ”A reference is just another name for an object” En referens får inte vara ogilitig. Det går inte att kontrollera om en referens är giltig. Medan en pekare är ett begrepp som vi måste aktivt dereferera för att komma åt det underliggande objektet så är alla operationer på en referens egentligen operationer på objektet, automatiskt. Vi kan se referensen som ett alias till objektet. En referens måste alltid initieras till adressen av en annan variabel/konstant av korrekt typ. Vi kan exempelvis inte initiera/tilldela en referens till ett värde direkt. OGILTIGT!! int& intRef = 1; Det finns dock undantag till regeln om att en referens måste initieras, och det är om en referens är en medlemsvariabel. Då måste referensen initieras i klassens konstruktor, vilket vi kommer att beskriva i en senare föreläsning. Varför vill man då ha referenser? Förrutom de välkända skälen att få en snabbare exekvering genom att undvika minneskopiering så kan man även använda dem för att kunna ha tillgång till samma variabel/objekt på liknande sätt som pekare.

Använda referenser Om man har en referens till ett objekt kan man anropa dess funktioner med variabelnamn.funktionsnamn(parametrar) Ex: ExampleClass myClass2 = &myClass; myClass2.func(1.1, 3.5, 5.7); Läser lokal variabel med liknande syntax. int id = myClass.m_ID; Det vara lite allmänt om referenser, nu till hur man använder dem. Om man har en referens till ett objekt kan man använda . punktnotation för att anropa medlemsfunktioner, komma åt medlemsvariabler etc. I exemplet initierar vi referensen med adressen av pekarens objekt. Vi kan sedan anropa funktionen f i myClass2.

Minneshantering Allokera nytt minne och skapa nya objekt med new. MyClass* m_class = new MyClass(); Ta bort instansen och återlämna minnet med delete. delete m_class; m_class = NULL; // Behövs inte men ger möjligheten att jämföra med NULL. Vi behöver bara använda delete på minne som har allokerats med new.

Minneshantering C++ har tre olika sorters minneshantering: Statiskt minne Globala och namespace-variabler, static variabler. Automatiskt minne/stack Funktionsargument och lokala variabler. Free store/heap Minnet allokeras med new. Eventuella minnesläckor finns här.

Översiktlig bild över minnet kod Stacken växer neråt med ökande antal ”stack frames”. statiskt minne stack Heapen växer uppåt med mera dynamiskt allokerat minne (new/delete). heap

Frågor? Resten av tiden till frågor.