OOP Objekt-orienterad programmering



Relevanta dokument
OOP Objekt-orienterad programmering

Introduktion till arv

Klasshierarkier - repetition

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

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

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

OOP Objekt-orienterad programmering

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

Övningar Dag 2 En första klass

OOP Objekt-orienterad programmering

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

Laboration 1 - Grunderna för OOP i Java

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

OOP Omtenta

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Konstruktion av klasser med klasser

Arv. Objektorienterad och komponentbaserad programmering

Föreläsning 13 Innehåll

Objektorienterad programmering i Java

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

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

Tentamen. Grundläggande programmering i Java A 5p, DTAA

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Objektorienterad programmering

TENTAMEN OOP

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

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

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

OOP Tentamen

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Tentamen OOP

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

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

Föreläsning 9: Arv och UML

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

OOP Tenta

Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

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

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

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

TENTAMEN OOP

Polymorfi. Objektorienterad och komponentbaserad programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programmering (TDDC77)

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Laboration 1: Figurer i hierarki

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

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

OOP Exempel Tentamen 2007

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

OOP Omtenta

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Föreläsning 5-6 Innehåll

Classes och Interfaces, Objects och References, Initialization

Programmering för språkteknologer II, HT2014. Rum

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

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

F8: Typkonvertering i C++

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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

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

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

DAT043 - Föreläsning 7

Malmö högskola 2008/2009 CTS

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad Programmering (TDDC77)

Ärvning av implementation. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

TENTAMEN OOP

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

LÖSNINGSFÖRSLAG TENTAMEN

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

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

Repetition av viktiga begrepp inom objektorienterad programmering

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

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

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

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

1 Repetition av viktiga begrepp inom objektorienterad programmering

Tentamen i Objektorienterad programmering

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Transkript:

OOP F9:1 OOP Objekt-orienterad programmering Föreläsning 9 Arv och klasshierarkier Polymorfism OOP F9:2 Djur - String namn - int vikt + String getnamn() + int getvikt() + void ökavikt(int x) Ko - int mjölkvolym + int getvolym() + void ökavolym(int x) Lamm - int ullmängd + int getull() 1

extends För att tala om vilken klass man ärver från används extends private int vikt; public String getnamn(){ return namn; public int getvikt(){ return vikt; public void ökavikt(int x){ vikt+=x; OOP F9:3 class Ko extends Djur{ private int mjölkvolym; public int getvolym(){ return mjölkvolym; public void ökavolym(int x){ mjölkvolym+=x; class Lamm extends Djur{ private int ullmängd; public int getull(){ return ullmängd; Lätt att lägga till nya klasser Djur OOP F9:4 class Gris extends Djur{ private int styrka; public int getstyrka(){ return styrka; public void ökastyrka(int x){ styrka+=x; Ko Lamm Gris - int styrka + int getstyrka() + void ökastyrka(int x) 2

Synlighetsmodifieraren protected Anger att ett attribut kan användas i subklasser till denna klass. protected int vikt; public String getnamn(){ return namn; public int getvikt(){ return vikt; public void ökavikt(int x){ vikt+=x; Djur - String namn # int vikt + String getnamn() + int getvikt() + void ökavikt(int x) OOP F9:5 Konstruktorer Subklassernas konstruktorer MÅSTE anropa superklassens konstruktor. Görs med: super(... ); Måste stå överst i konstruktorn. OOP F9:6 protected int vikt; public Djur(String na, int v){ namn=na; vikt=v; class Ko extends Djur{ private int mjölkvolym; public Ko(String na, int v, int mjö){ super(na, v); mjölkvolym=mjö; class Lamm extends Djur{ private int ullmängd; public Lamm(String na, int ull){ super(na, 40); ullmängd=ull; Ett Lamm har alltid startvikten 40 3

Default-super-anrop Om man utelämnar super(...) så lägger kompilatorn in ett default-anrop utan argument: super(); För att det skall fungera MÅSTE superklassen ha en argumentlös konstruktor. protected int vikt; public Djur(String na, int v){ namn=na; vikt=v; OOP F9:7 class Gris extends Djur{ private int styrka; public Gris(int sty){ styrka=sty; OOP F9:8 Man skapar (oftast) endast objekt av klasserna "längst ner" i hierarkin. Ko k=new Ko("Rosa", 117, 3); Lamm l=new Lamm("Bäbä 1", 37); Gris g=new Gris(88); En referens av typen djur kan referera till vilken subklass som helst. Djur Ko Lamm Gris Djur d1, d2, d3; d1=new Ko("Blenda", 195, 4); d2=new Lamm("Bäbä 2", 43); d3=new Gris(107); Praktiskt om man t.ex. vill ha en "blandad" samling: Djur[] alladjuren=new Djur[25]; ArrayList<Djur> djuren = new ArrayList<Djur>(); 4

Åtkomst Objekt som skapas består av flera olika "logiska" delar. Det skapade objektet är "alltihop" men kan betraktas som flera hopsatta delar. Vad man kommer åt hos objektet beror på hur referensen är deklarerad. Ko k=new Ko("Rosa", 112, 4); Djur d=new Ko("Mu", 174, 5); Via k kommer man åt allt. Via d kommer man endast åt det som finns i Djur-delen. getnamn getvikt ökavikt Ko namn vikt getvolym mjölkvolym ökavolym OOP F9:9 Djur-del Ko-del Cast & instanceof OOP F9:10 Djur-pekaren pekar på hela objektet. Kan man komma åt Ko-delen? Ja - genom att kvalificera (eller cast'a) referensen: ((Ko)d).ökaVolym(2); Detta fungerar endast om det verkligen ÄR ett Ko-objekt. Skulle det råka vara ett Lamm-objekt blir det exekveringsfel. Man bör kontrollera att det verkligen är ett Ko-objekt innan man gör castingen. Att kolla vilket sorts objekt det är görs med instanceof. if (d instanceof Ko) ((Ko)d).ökaVolym(2); Att sätta referenser till objekt: d = k; Detta går bra k = d; Går ej, måste cast'a: k = (Ko)d; 5

OOP F9:11 Vi antar nu att alla djur har ett visst värde. Värdet räknas ut på olika sätt beroende på djursort: Ko - värdet är vikten * mjölkvolymen Lamm - värdet är kvadraten på ullmängden Gris - värdet är vikt * 3 + styrkan Eftersom värdet är beroende av andra attribut och dessa andra attribut kan ändras implementerar vi värdet som en metod. I alla Djur-subklasserna skall vi ha metoden: //räknas ut olika beroende på vilken djursort class Ko extends Djur{ private int mjölkvolym; return vikt*mjölkvolym; OOP F9:12 Attributet vikt kan användas eftersom det är deklarerat som protected i Djur class Lamm extends Djur{ private int ullmängd; return ullmängd*ullmängd; class Gris extends Djur{ private int styrka; return vikt*3+styrka; Åtkomst från t.ex. en Ko-referens: Ko k; int summa=k.värde(); Från en Djur-referens: Djur d; if (d instanceof Ko) summa=((ko)d).värde(); 6

Anta att vi vill ha en metod som får en ArrayList med blandade djur som argument och som returnerar sammanlagda värdet av dessa djur. OOP F9:13 int summavärde(arraylist<djur> djuren){ int summa = 0; for (Djur aktuell : djuren) if (aktuell instanceof Ko) summa += ((Ko)aktuell).värde(); else if (aktuell instanceof Lamm) summa += ((Lamm)aktuell).värde(); else if (aktuell instanceof Gris) summa += ((Gris)aktuell).värde(); return summa; Så här går bra att göra. Dock lite omständigt. Vi vet ju att alla djur har ett värde. Borde kunna göras enklare... Speciellt dåligt om vi lägger till ett nytt sorts djur, t ex Häst. Då måste metoden summavärde ändras. abstract Vi vill markera i Djur-delen att det finns en metod värde i subclasserna. Detta för att kunna komma åt metoden värde från en Djur-referens. OOP F9:14 protected int vikt; abstract public int värde(); Så fort det finns minst en abstract metod i en klass KAN man inte skapa en instans av klassen. Abstract-deklarationen talar om att metoden finns definierad i en subklass till denna klass. Om man har en abstract metod måste dessutom hela klassen vara abstract, dvs vi måste skriva: abstract Man kan ange att en klass är abstract utan att ha abstracta metoder. Detta för att förhindra instansiering (man kan då ej göra new). 7

Polymorfism - dynamisk bindning OOP F9:15 Har vi deklarerat värde() som abstract i klass Djur kan summavärde skrivas om: int summavärde(arraylist<djur> djuren){ int summa = 0; for (Djur aktuell : djuren) summa += aktuell.värde(); return summa; Nu kommer "rätt" värde-metod att bli anropad. Detta kallas dynamisk bindning eftersom kompilatorn inte kan veta vilken metod som skall anropas utan det beror på vad som råkar ligga på respektive ställe i ArrayListan. Under körning binds alltså anropet till den värde-metod som är aktuell. Denna mekanism kallas också polymorfism. Skulle vi nu vilja ha ett annat sorts djur, t ex en häst som har attributet antal vunna lopp och värdet antalvinster * vikt kan vi enkelt lägga till denna klass: OOP F9:16 class Horse extends Djur{ private int antalvinster; return antalvinster * vikt; OBS - måste även ha en konstruktor... Nu behöver inte metoden summavärde ändras - den fungerar automatiskt även med objekt av typen Horse. Att på detta sätt kunna lägga till nya klasser utan att behöva ändra i "gammal" kod är mycket kraftfullt och en av (många) fördelar med objektorientering. Att det går beror på mekanismerna arv och polymorfism. 8

OOP F9:17 Anta att vi vill lägga till att alla djur kan äta. Det äter en viss vikt mat och djurets vikt ökar med halva vikten av det den ätit. Detta gäller alla djur utom grisar. Grisens vikt ökar med hela vikten av det den ätit + att grisens styrka ökar med 1. I klass Djur lägger vi till metoden äta enligt: public void äta(int mat){ vikt += mat/2; I klass Gris lägger vi in en annan äta nämligen: public void äta(int mat){ vikt += mat; styrka++; Nu kan vi direkt med en Djur-referens anropa metoden Djur d; //Kan referera till Ko, Lamm, Gris eller Horse d.äta(4); Rätt äta-metod anropas. Att på detta sätt i Gris skriva en egen äta som omdefinierar äta hos Djur kallas överskuggning. Vi överskuggar default-äta hos Djur och den dynamiska bindningen gör att rätt äta anropas. Polymorfism eller dynamisk bindning kan alltså åstadkommas på två olika sätt: 1. I superklassen deklareras en abstract metod som sedan måste implementeras i alla subclasser. Detta gjordes med värde. 2. I superklassen implementeras en "default"-metod och denna gäller för alla subklasser som INTE har en egen metod som överskuggar superklassens. Detta gjordes med äta. OOP F9:18 I båda fallen får vi det beteende vi vill ha, nämligen att metoderna kan anropas från en Djur-referens och rätt metod kommer alltid att bli anropad. Vi kan dessutom lätt utöka modellen med nya typer av Djur utan att behöva ändra i det som fanns tidigare. 9