OOP Objekt-orienterad programmering

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

Avlusning Debugger (”avlusare”) Breakpoints Watch.
Klasser och objekt.
Next previous Internetprogrammering 2000 Internetprogrammering 2000 Föreläsning 10 Distribuerad programmering med Javas RMI, Remote Method Invocation.
Klassarv och inkapsling
ObjektOrienterad analys och design. SVP Vt2009 Föreläsning nr 2, måndag 8 april kl Diskussion (kurshemsida): Om designuppgiften Om projektuppgiften.
Metoder i java Det finns två typer av metoder i java
Föreläsning 4 Python: mera om funktioner och parametrar
Arv.
Inkapsling.
Polymorfism.
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
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.
Föreläsning 11 Arrayer.
Objektorienterad programmering i Java
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Programmering i C# 3. Klasser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Klasser och objekt Klasser, objekt och instansvariabler
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
Föreläsning 8, kapitel 8 Förbättra strukturen med arv Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael.
Vektorer (klassen Vector) Sortering
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
Polymorfism.
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Räckvidd och synlighet. Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 22 Synlighet (meddelandesändning) Det.
Programmering i C# 5. Structer.
Arv.
Programmeringsteknik för Media1 & K1
OOP F6:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 6 Mer om klasser och objekt Hantera många objekt ArrayList toString() – metoden.
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.
Next previous RMI, Remote Method Invocation Om du har boken av Marty Hall, läs avsnitt 15.8 För fler exempel se:
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.
OOP F14:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 14 Repetition Tips inför inlämningsuppgift 2.
Föreläsning 4 Klasser Och Objekt.
Objektorienterad programmering i Java
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
Föreläsning 13 Appletprogram/fristående grafiska program Arv Rita linjer, rektanglar mm Skriva text, byta färg Appletprogram & HTML Grafiska användargränssnitt.
Föreläsning 9 Arv kap 8.1 Interface kap 9.2 Grafiska användargränssnitt (GUI) kap 10.
1 Föreläsning 8 Mer om klasser och objektorientering.
OOP F2:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 2 Deklaration och tilldelning Programsatser Tilldelning Input/Output Selektion.
Arv repetition Arv = Är relation Tillgänglighet public, protected och private. Överklass ös Direkt härledd underklass dhu: Class dhu : public ös{} Indirekt.
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.
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
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.
Föreläsning4 Repetition slingor Metoder. while-sats består av följande delar: 1. while 2. Villkor-sats (condition) 3. uttryck (statement) while-sats int.
1 Föreläsning 6 Repetition på metoder Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
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.
Malmö högskola Rolf Axelsson 2003/2004 DA7231, 4 poäng Referensvariabel Klass och konstruktorer Klass med set- och get-metoder Klass och fält Fler metoder.
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.
Föreläsning 9: Arv och UML
Presentationens avskrift:

OOP Objekt-orienterad programmering Föreläsning 9 Arv och klasshierarkier Polymorfism

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()

extends För att tala om vilken klass man ärver från används extends class Djur{ private String namn; private int vikt; public String getNamn(){ return namn; } public int getVikt(){ return vikt; public void ökaVikt(int x){ vikt+=x; extends För att tala om vilken klass man ärver från används extends 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 Ko Lamm Gris - int styrka + int getStyrka() + void ökaStyrka(int x) class Gris extends Djur{ private int styrka; public int getStyrka(){ return styrka; } public void ökaStyrka(int x){ styrka+=x;

Synlighetsmodifieraren protected Anger att ett attribut kan användas i subklasser till denna klass. Djur - String namn # int vikt + String getNamn() + int getVikt() + void ökaVikt(int x) class Djur{ private String namn; protected int vikt; public String getNamn(){ return namn; } public int getVikt(){ return vikt; public void ökaVikt(int x){ vikt+=x;

Konstruktorer Subklassernas konstruktorer MÅSTE anropa superklassens konstruktor. Görs med: super( ... ); Måste stå överst i konstruktorn. class Djur{ private String namn; 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

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. class Djur{ private String namn; protected int vikt; public Djur(String na, int v){ namn=na; vikt=v; } class Gris extends Djur{ private int styrka; public Gris(int sty){ styrka=sty; }

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 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>(); Djur Ko Lamm Gris

Åtkomst Ko Djur-del Ko-del 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 getVolym ökaVolym namn vikt mjölkVolym Ko Djur-del Ko-del

Cast & instanceof 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) Att sätta referenser till objekt: d = k; Detta går bra k = d; Går ej, måste cast'a: k = (Ko)d;

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: public int värde(){ //räknas ut olika beroende på vilken djursort }

Attributet vikt kan användas eftersom det är deklarerat class Ko extends Djur{ private int mjölkVolym; public int värde(){ return vikt*mjölkVolym; } Attributet vikt kan användas eftersom det är deklarerat som protected i Djur class Lamm extends Djur{ private int ullMängd; public int värde(){ return ullMängd*ullMängd; } Å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(); class Gris extends Djur{ private int styrka; public int värde(){ return vikt*3+styrka; }

argument och som returnerar sammanlagda värdet av dessa djur. 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. 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. 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 class Djur{ 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). class Djur{ private String namn; protected int vikt; abstract public int värde(); }

Polymorfism - dynamisk bindning Har vi deklarerat värde() som abstract i klass Djur kan summaVärde skrivas om: 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. int summaVärde(ArrayList<Djur> djuren){ int summa = 0; for (Djur aktuell : djuren) summa += aktuell.värde(); return summa; }

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: 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. class Horse extends Djur{ private int antalVinster; public int värde(){ return antalVinster * vikt; } OBS - måste även ha en konstruktor ...

Anta att vi vill lägga till att alla djur kan äta 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: I klass Gris lägger vi in en annan äta nämligen: 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. public void äta(int mat){ vikt += mat/2; } public void äta(int mat){ vikt += mat; styrka++; }

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. 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.