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

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

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

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

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Föreläsning 4. Polymorfism. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Classes och Interfaces, Objects och References, Initialization

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

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

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

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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

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

OOP Objekt-orienterad programmering

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

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

Sammanfattning och Tentamensinfo Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Föreläsning 4. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder. Abstraction & Information Hiding

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Instuderingsuppgifter läsvecka 2

Föreläsning 4 Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Klasshierarkier - repetition

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design Alex Gerdes, 2018

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

DAT043 - föreläsning 8

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

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

Objektorienterad Programmering (TDDC77)

OOP Objekt-orienterad programmering

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Föreläsning 13 Innehåll

Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Modulär design Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 2. Polyfmorfism Dynamisk bindning Interface och abstrakta klasser Överlagring Överskuggning Accessorer och mutatorer

Undantag, Sammanfattning och Tentamensinfo. Objekt-orienterad programmering och design Alex Gerdes, 2016

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

DAT043 - Föreläsning 7

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

TDDC76 - Programmering och Datastrukturer

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

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

Föreläsning 5-6 Innehåll

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

TDDD78 Objektorientering i Java, del 2

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

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

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

Polymorfi. Objektorienterad och komponentbaserad programmering

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Introduktion till arv

Föreläsning REPETITION & EXTENTA

Objektorienterad programmering med Java, Generics

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Föreläsning 9: Arv och UML

Java, klasser, objekt (Skansholm: Kapitel 2)

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Objektorienterad programmering

Arv och polymorfism i Java

TDA550 Objektorienterad programmering, fortsättningskurs. Föreläsning 1. Introduktion Variabler och typer

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

TDDD78 Objektorientering: Lagring och livstid

Kopiering av objekt i Java

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

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Kursombud. Objektorienterad modellering och diskreta strukturer / design. Agile? Designprinciper EDAF10 EDA061. Lennart Andersson. Grupper för projekt

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

Kort om klasser och objekt En introduktion till GUI-programmering i Java

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Arv. Objektorienterad och komponentbaserad programmering

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

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

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

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

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

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

SOLID är en akronym för fem stycken designprinciper som används vid mjukvaruutveckling. SOLID står för:

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

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

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

Laboration 1: Figurer i hierarki

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

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

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

TDA550 - Objektorienterad programvaruutveckling, fk

Transkript:

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

Diagnostiskt prov Shape + overlaps(shape): int return 1; Shape shape = new Shape(); Polygon tripoly = new Triangle(); Shape trishape = new Triangle(); Triangle triangle = new Triangle(); Polygon + overlaps(polygon): int + overlaps(shape): int return 2; return ; shape.overlaps(shape); shape.overlaps(triangle); tripoly.overlaps(shape); tripoly.overlaps(trishape); tripoly.overlaps(tripoly); tripoly.overlaps(triangle); 1 1 2 2 Triangle + overlaps(triangle): int return 4; trishape.overlaps(shape); trishape.overlaps(trishape); trishape.overlaps(tripoly); triangle.overlaps(shape); triangle.overlaps(trishape); triangle.overlaps(triangle); 4

Type checking Java är ett mestadels starkt typat språk. Kortfattat innebär detta att om kod kompilerar korrekt, så kommer den också att köra utan missöden. Om en metod anropas via en variabel, och detta anrop bedöms giltigt av javas type checker (typkontrollen), då kommer objektet som referensen i variabeln pekar på när programmet körs garanterat ha den metoden definierad. Mestadels det finns undantag (som fångas vid run time). (Det finns ingen formell definition av vad starkt typat innebär.)

Static type vs Dynamic type En referens-variabel har en declared type detta är dess statiska typ, och den kommer alltid att vara densamma (därav ordet statisk). En referens-variabel refererar till ett objekt i heapen. Det objektets typ är variabelns dynamiska typ. Denna kan förändras (därav ordet dynamisk), om variabeln ges ett nytt referensvärde som pekar på ett annat objekt med en annan typ. Notera: Objektets typ förändras inte efter att det har skapats. Referensen förändras inte, den kommer alltid att peka på samma objekt. Variabeln (som namnet antyder) är det som kan ändras, genom att ges ett nytt referens-värde.

Compile time vs run time Typinformation används vid två olika tillfällen: Kompilatorn utför statisk typkontroll (static type checking). Denna information används enbart vid kompileringen, för att garantera att allt kommer att gå rätt när programmet körs, och för att välja rätt metod(signatur). Informationen om statisk typ sparas inte efter kompileringen. Under exekvering görs dynamisk typkontroll (dynamic type checking), och den dynamiska typen används för att bestämma vilka metoder som faktiskt körs. Tack vare att statisk type checking redan gjorts vet vi att de metoder vi försöker anropa alltid finns hos objekten i fråga.

Overloading Overloading innebär att ett objekt (eller class) har flera metoder med samma namn, men olika signatur (dvs typer på dess parametrar). String.subString(int beginindex); String.subString(int beginindex, int endindex); Vilken av signaturerna som används bestäms statiskt, vid kompilering. De två metoderna ovan är två helt olika metoder, vad Java anbelangar. De råkar bara ha samma namn. Vilken av dem som avses med ett specifikt anrop är vad som bestäms statiskt.

Overriding Overriding innebär att en subklass kan definiera en metod med samma namn och signatur som en metod i dess superklass. Polygon.paint(Graphics g); Triangle.paint(Graphics g); De två anropen ovan är till samma metod som kan förekomma i flera olika implementationer. Vilken av implementationerna som används bestäms dynamiskt, vid exekvering. Vi säger att metoden är polymorf.

Polymorfism Polymorfism är namnet på det fenomen som tillåter ett objekt (metod, funktion, ) att uppträda som om det hade flera olika typer statiskt. Poly = många, morf = form Ett objekt skapat från class T kan uppträda som T, eller som vilken som helst av T s supertyper inklusive interface-typer som implementeras av T.

Polymorfism omvänt Ett objekt kan uppträda som flera olika statiska typer. Omvänt innebär det också att en variabel (eller metod-parameter) kan vid olika tidpunkter hålla referenser som pekar på objekt av olika faktisk typ. Variablerna har då olika dynamisk typ vid de olika tidpunkterna. En variabel med statisk (referens-)typ S kan hålla referenser som pekar på objekt av typ S (om sådana existerar), eller vilken (konkret) subtyp som helst till S. Om S är en abstract class eller interface måste referensen peka på ett objekt av en subtyp. Mer om sub- och super-typer och deras användning senare.

Dynamisk binding Dynamic binding (även dynamic dispatch) innebär generellt att ett val mellan flera möjliga implementationer av en polymorf metod avgörs vid run time. Utan dynamic binding skulle inte polymorfism för objekt fungera! for (Polygon p : polygons) { p.paint(g); } Variabeln p har statisk typ Polygon. Om metodval gjordes baserat på statisk typ, då skulle koden ovan alltid anropa paint-metoden definierad i Polygon!

En värld utan dynamic binding För att kunna ge de olika subklasserna olika beteende vid utritning skulle vi i princip behöva kolla den dynamiska typen på varje polygon: for (Polygon p : polygons) { if (p instanceof Triangle) { ((Triangle) p).paint(g); } else if (p instanceof Square) {...} } Denna kod är definitivt inte extensible (eller vacker) vi måste känna till alla olika sorters polygoner från början, vi kan inte lägga till fler i efterhand utan att ändra koden.

Resolving overloading Vid anrop till metoden tripoly.overlaps(triangle) händer följande statiskt: 1. Kompilatorn tar reda på vilken deklarerad typ tripoly har. 2. Kompilatorn tittar i den aktuella klassen (eller interfacet), och dess superklasser (superinterface) efter alla metoder med namn overlaps.. Kompilatorn tittar på parameterlistorna för de olika alternativen, och väljer den som bäst överensstämmer med den deklarerade typen för argumenten till anropet. I vårt fall gäller följande: tripoly har deklarerad typ Polygon. Polygon har två olika metoder med namn overlaps: overlaps(polygon) och overlaps(shape). Argumentet triangle har deklarerad typ Triangle. Den parameterlista som stämmer bäst är overlaps(polygon), eftersom Polygon är en närmare superklass till Triangle än vad Shape är. Mer om overloading och vad bäst innebär när vi går in djupare på subtyper.

Resolving overriding Vid run time ska rätt implementation väljas av de som finns för metoden i fråga. Sökningen startar i den faktiska klassen för objektet som får metodanropet. Finns en implementation där så väljs den. Annars fortsätter sökningen längs kedjan av superklasser tills metoden påträffas. Metoden kommer garanterat påträffas annars hade vi fått ett fel vid kompileringen. S ö k v ä g Shape + overlaps(shape): int Polygon + overlaps(polygon): int + overlaps(shape): int Triangle + overlaps(triangle): int trishape :Triangle

Diagnostiskt prov - revisited Shape + overlaps(shape): int return 1; Shape shape = new Shape(); Polygon tripoly = new Triangle(); Shape trishape = new Triangle(); Triangle triangle = new Triangle(); S ö k v ä g Polygon + overlaps(polygon): int + overlaps(shape): int return 2; return ; shape.overlaps(shape); shape.overlaps(triangle); tripoly.overlaps(shape); tripoly.overlaps(trishape); tripoly.overlaps(tripoly); tripoly.overlaps(triangle); 1 1 2 2 Triangle + overlaps(triangle): int return 4; trishape.overlaps(shape); trishape.overlaps(trishape); trishape.overlaps(tripoly); triangle.overlaps(shape); triangle.overlaps(trishape); triangle.overlaps(triangle); 4

Quiz: Plug-n-play Konceptet plug-n-play innebär att en komponent kan direkt pluggas in i ett system, och systemet ska fungera utan att förändras eller konfigureras om. Hur kan vi bäst åstadkomma plug-n-play för mjukvarukomponenter (e.g. objekt)? Svar: Med hjälp av polymorfism, genom att låta deklarerade statiska typer för alla variabler ha så bred (wide) typer som möjligt dvs vara supertyper, inte subtyper. Bred typ = en typ som kan representera många olika sorters objekt

Exempel Live code

Dependency Inversion Principle Depend on abstractions, not on concrete implementations. Genom att använda supertyper istället för subtyper kan vi minska beroendet av en specifik klass. MYCKET mer om att minska beroenden senare i kursen.

Principer hur hänger de ihop? Vårt slutgiltiga mål är extensibility, reusability, maintainability. The Open-Closed principle (OCP): Software modules should be open for extension, but closed for modification. En konkret formulering av målet ovan, som ger oss ett sätt att tänka vid alla kodutveckling. The Dependency Inversion principle (DIP): Depend on abstractions, not on concrete implementations. Ett av våra viktigaste verktyg för att uppnå OCP.