1 Klasser och objektorientering Vad är objektorientering?

Relevanta dokument
Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Övningar Dag 2 En första klass

TDIU01 Programmering i C++

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Introduktion till arv

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Programmering B med Visual C

Grundläggande programmering med C# 7,5 högskolepoäng

TDIU01 - Programmering i C++, grundkurs

Generiska konstruktioner. Kursbokens kapitel 13

TDDC76 Programmering och datastrukturer

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Det finns många flaggor till g++,

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

C++ Objektorientering - Klasser. Eric Elfving

+Överskådlighet Normalt sätt blir ett program skrivet i det procedurella paradigmet överskådligt. Modifikationer på delproblem kan ske med lätthet.

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Imperativ programmering. Föreläsning 4

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TUTORIAL: KLASSER & OBJEKT

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Tillämpad programmering

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Minnestilldelning (allokering) och frigörande (avallokering) av minne

TDDC76 - Programmering och Datastrukturer

Dynamisk bindning och polymorfism

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

TDIU01 - Programmering i C++, grundkurs

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Enkla variabler kontra referensvariabel

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

JAVA Mer om klasser och objektorientering

Föreläsning 5-6 Innehåll

Programmering = modellering

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Classes och Interfaces, Objects och References, Initialization

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

5 Arv och dynamisk bindning FIGUR

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Klasser och objekt. Henrik Johansson. August 20, 2008

Modeller, Objekt och Klasser

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

TDIU01 - Programmering i C++, grundkurs

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

OOP Objekt-orienterad programmering

TDDC76 - Programmering och Datastrukturer

Objektorienterad programmering i Java

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Metoder (funktioner) Murach s: kap Winstrand Development

Objektorienterad programmering, allmänt

Viktiga egenskaper hos ett program (Meyer): Objektorienterad programmering, allmänt. Vilka egenskaper vill vi att våra program ska ha?

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Malmö högskola 2007/2008 Teknik och samhälle

Objektorienterad programmering. Grundläggande begrepp

Objektorienterad Programmering (TDDC77)

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Objektorienterad Programmering (OOP) Murach s: kap 12-16

grundläggande C++, funktioner m.m.

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

TDDC76 - Programmering och Datastrukturer

1 Namnkontroll (NameControl)

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Objektorienterad programmering Föreläsning 4

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

TDDC76 - Programmering och Datastrukturer

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Objektorientering: Lagring, räckvidd och livstid

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

Objekt och klasser - Introduktion

Tommy Färnqvist, IDA, Linköpings universitet

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Transkript:

1 Klasser och objektorientering Vad är objektorientering? Det finns olika synsätt på programmering, dessa olika synsätt kallas för paradigm. De vanligaste paradigmen är det imperativa/proceduriella, det funktionella, det deklarativa och det objektorienterade. Det imperativa/proceduriella paradigmet har ni använt i föregående kurs, Programmeringsteknik. Det innebär att ett program ses som en sekvens av händelser/programsatser. I det funktionella paradigmet består programmet av funktioner. Mer komplicerade funktioner komponeras utifrån mindre funktioner. Ett exempel är om du har en funktion som adderar talen i en talföljd samt en funktion som räknar antalet tal i en talföljd. Dessa två funktioner kan då kombineras för att skapa en funktion som räknar ut medelvärdet av talen i en talföljd, de två funktionernas utdata blir indata till den nya funktionen. Det deklarativa paradigmet går ut på att man beskriver problemet man vill lösa på ett exakt och koncist sätt. Utifrån problembeskrivningen "ges" sedan en korrekt algoritm. Detta paradigm skiljer sig avsevärt från de andra eftersom man inte formulerar en algoritm för att lösa problemet, utan endast ger en problembeskrivning. Paradigmet grundar sig på matematisk logik och används främst för utveckling av AI-applikationer. I det objektorienterade paradigmet ses ett program som en samling av komponenter kallade objekt. Dessa objekt kan kommunicera genom att skicka meddelanden till varandra. Det objektorienterade paradigmet är väl lämpat att använda, både för att implementera ADTer (du behöver inte känna till vad ADTer är ännu) och för att konstruera mjukvara generellt, därför kommer detta paradigm att användas genomgående i kursen. Det innebär att ni kommer att få en viss träning i och introduktion till objektorientering i denna kurs även om fokus inte ligger på objektorienterad programmering i sig. 1.1 Objekt Vad kan utgöra ett objekt? Det finns en bra tumregel. Om ett ord är ett substantiv kan det representeras genom ett objekt. D v s om man kan sätta en eller ett framför ordet. Några exempel är, en person, en bil, en katt, en lista o s v. Varje objekt karaktäriseras av tre viktiga egenskaper: Identitet Operationer Tillstånd Identitet Att ett objekt har en identitet innebär att varje specifikt objekt kan identifieras. Varje objekt är alltså unikt. Jämför med t ex en person, varje person är unik och kan identifieras. Operationer Varje objekt kan associeras med ett antal operationer som bestämmer ett objekts beteende och vad det kan utföra, t ex vilka tjänster det tillhandahåller. Om vi återigen använder objektet person som ett exempel kan några operationer vara spring, gå och ät. Det är med hjälp av 1

operationerna man skickar meddelanden till ett objekt. Man anropar ett objekts operationer. Olika objekt kan anropa varandras metoder, det är så kommunikationen går till. Jämför med två olika personer, vilka kan ses som två skilda objekt, som gör varandra en tjänst. Var och en begär en tjänst av den andre genom att på något sätt skicka ett meddelande. Anmärkning: Givetvis kan objekt av olika typer också kommunicera. Exempelvis kan en person kommunicera med en hund. Operationer kallas också för metoder och i C++ även funktioner, dessa ska ni betrakta som synonymer. Ni kommer att känna igen dessa operationer/funktioner även för objekt eftersom de ser lika ut som de funktioner ni kommit i kontakt med i kursen Programmeringsteknik. Tillstånd Ett objekts beteende beror av tidigare händelser och därför kan man säga att ett objekt har ett sorts minne. Detta minne betecknas som ett tillstånd. Jämförelsen med en person är fortfarande relevant, som människa influeras man av de erfarenheter man samlat på sig. Varje erfarenhet sätter sitt spår, i ditt minne, på kroppen o s v. Ett objekt befinner sig alltid i ett visst tillstånd. Tillståndet kan varieras. Om tillståndet förändras är detta en konsekvens av att en operation som förändrar objektets tillstånd har anropats. Jämför återigen med en person, säg att vi har en person som för tillfället är glad. Plötsligt förolämpas den glada personen av en annan person. Tillståndet för den nyss glada personen kommer då att förändras från glad till arg och/eller ledsen. Det finns också operationer som inte förändrar tillståndet för ett objekt, utan har till uppgift att på något sätt inspektera tillståndet. Jämför med en person som frågar en annan person om denne är glad. Svaret som fås säger något om den tillfrågades tillstånd. 1.2 Klasser Klasser är C++ och andra objektorienterade språks sätt att definiera och implementera datatyper. Med hjälp av klasser kan man skapa objekt. Klassen utgör en mall för att skapa objekt. Jämför med en gjutform för vevstakar. För att skapa en konkret vevstake, som ju är ett objekt, använder vi gjutformen genom att hälla i flytande metall. Gjutformen kan då sägas utgöra en mall för att skapa vevstakar. Skillnaden gentemot klassen är att gjutformen till slut inte går att använda p g a att den slitits ut. En klass slits aldrig ut, det går att skapa oändligt många objekt utifrån en klass. Detta är en generell observation som gäller mjukvara, mjukvara slits inte ut på så sätt som materiella ting. Den kan bli föråldrad på så vis att man önskar ny eller förändrad funktionalitet, men själva mjukvaran fungerar precis som den alltid gjort, att det gått 20 år sedan den konstruerades har ingen betydelse för dess funktionsduglighet. Med hjälp av klasser skapar vi och implementerar sammansatta datatyper. En sammansatt datatyp kan förenklat sägas vara en datatyp som består av andra datatyper. Den sammansatta datatypen har också ett antal operationer som kan utföras på den. I föregående kurs har ni använt structen för att skapa en sammansatt datatyp, i denna kurs kommer vi endast att använda klasser. Structen stödjer inte objektorientering, och är heller ingen konstruktion som återfinns i andra objektorienterade programspråk. Då man skapar ett objekt utifrån en klass säger man att man instansierar ett objekt. Ett objekt är en instans av en klass. 2

1.3 Ett exempel på en klass skriven i C++, samt användning av denna Här följer ett exempel på hur en klass, som försöker avbilda en person, kan se ut i C++. /************Person.h***************************/ // Klassdefinition class Person public: //Denna operation anropas när objektet skapas (konstrueras). Person(char* _namn); //konstruktor //Denna operation anropas när objektet destrueras. ~Person(); //destruktor //Operationen returnerar namnet char* hamtanamn(); //Operationen förolämpar personen. void forolampa(); //Operationen ger personen en komplimang void gekomplimang(); //Operationen frågar personen om denne är glad. bool arglad(); private: //variabeln namn representerar en persons namn som är en del av //tillståndet char* namn; ; //variablen glad representerar huruvida en person är glad //eller inte och är en del av tillståndet //glad == true innebär att personen är glad och glad == false //innebär att personen inte är glad. bool glad; //end Person.h /************Person.cpp***************************/ #include Person.h #include <string> //Definition av operationerna/funktionerna //Implementationen är inte gjord, endast pseudokod har skrivits. Person::Person(char* _namn) 3

//initiera objektets tillstånd //d v s datamedlemmarna namn och glad //Låt en person alltid vara glad från början Person::~Person() //Återlämna dynamiskt allokerat minne till systemet. char* Person::hamtaNamn() // returnera personobjektets namn void Person::forolampa() // definiera vad som ska hända om någon förolämpar personen void Person::geKomplimang() // definiera vad som ska hända om någon förolämpar personen bool Person::arGlad() // returnera personobjektets lyckotillstånd // end Person.cpp /************main.cpp***************************/ //I denna fil kommer vi att nyttja klassen Person för att skapa //Person-objekt. Denna fil och dess funktioner är en klient till //klassen Person. #include <iostream> #include "Person.h" int main() //Skapa Personobjektet Janne, konstruktorn anropas Person Janne( Janne Nilsson ); //Skapa Personobjektet Anna, konstruktorn anropas Person Anna( Anna Andersson ); using std::cout; using std::endl; cout << Anna.hamtaNamn(); if(anna.arglad()) 4

cout << är glad." << endl; else cout << är ledsen." << endl; Janne.forolampa(); cout << Janne.hamtaNamn(); if(janne.arglad()) cout << är glad." << endl; else cout << är ledsen." << endl; Janne.geKomplimang(); cout << Janne.hamtaNamn(); if(janne.arglad()) cout << är glad." << endl; else cout << är ledsen." << endl; return 0; //Då vi går ur funktionen kommer destruktorn för de båda objekten att köras atomatiskt. 1.4 Angående klassen Nedanstående observationer kommer att återkopplas mot exempelklassen ovan. En klass definieras m h a nyckelordet class i C++. representerar en abstraktion. Med abstraktion avses bl a att man endast tar med de delar som är av intresse. Givetvis är en verklig person mer komplex än vad klassen ovan speglar, jag har med hjälp av klassen abstraherat det beteende (med hjälp av operationerna) och de egenskaper jag är intresserad av i detta specifika fall. Med abstraktion avses också att man tillhandahåller ett gränssnitt som gör det enkelt att skapa och använda objekten. Mer om detta nedan i sektionen om public. kan jämföras med typer i övrigt, t ex int. int x; x får alla egenskaper och operationer som typen integer (heltal) har. Vad har datatypen int för operationer? har en publik (public) och en privat (private) del. har operationer/funktioner (synonymer) som är medlemmar i klassen. Operationerna ger oss ett gränssnitt mot objektet, d v s ett sätt att kommunicera med objektet. Operationerna återfinner du under klassens public-deklaration. public-del kan klienter använda. Det som finns i public-delen kan man alltså använda utifrån. Denna del kallas för klassens/objektets gränssnitt. har egenskaper/attribut som är medlemmar i klassen.. Egenskaper och attribut används ofta som synonymer. Det är dessa som utgör objektets tillstånd. Rent tekniskt är dessa 5

datamedlemmar i klassen och du återfinner dem under private-deklarationen. Man använder således datamedlemmarna för att representera tillståndet. Varje objekt som skapas får en egen uppsättning av dessa datamedlemmar. private-del gör det möjligt att skydda datamedlemmarna, som utgör objektets tillstånd, från missbruk. Endast klassens medlemmar har tillstånd att komma åt dessa. Datamedlemmar ska alltid vara privata. inkapslar data och operationer/funktioner i klassen. Inkapsling är ett viktigt begrepp i objektorientering och innebär att man kan "samla allt på ett ställe". I klassen samlar man det som tillhör den, d v s operationer och datamedlemmar. ger en modulär design, varje klass blir en modul. Klasser delas, i C++, lämpligen upp i en h-fil och en cpp-fil. Klassdefinitionen läggs i h-filen, och definitionen/implementationen av operationerna läggs i cpp-filen. Filerna ska helst också namnges utifrån klassen enligt Person-klassen ovan. befrämjar återanvändning, man kan skapa obegränsat många objekt från samma klass. har en konstruktor som anropas då man skapar objektet. I implementationen för konstruktorn måste man initiera objektets tillstånd, d v s man måste ge datamedlemmarna vettiga värden. Det måste man göra för att ett nyskapat objekt ska befinna sig i ett vettigt tillstånd. o En konstruktor har samma namn som klassen. o Det kan finnas flera konstruktorer i en klass, de måste kunna skiljas åt av parameterlistan. o En konstruktor har ingen returtyp. har en destruktor som anropas automatiskt då objektet går ur scope ("dör"). Denna ska man aldrig anropa som klient. I implementationen för destruktorn ska man återlämna eventuellt dynamiskt allokerat minne till systemet. Minne som allokerats m h a new måste tas bort med delete. o En destruktor har samma namn som klassen. Namnet föregås av tildetecknet (~) o Det kan endast finnas en destruktor. o En destruktor har inga parametrar. o En destruktor har ingen returtyp. Objektets identitet utgörs av dess variabelnamn, i exemplet ovan har de två objekten identiteterna Janne respektive Anna. Varje objekt får sin identitet när de skapas. Den som skapar objekten namnger dem och ger dem därmed en identitet. 6