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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

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

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

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

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

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

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

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

OOP Objekt-orienterad programmering

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

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

Klasshierarkier - repetition

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

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

Instuderingsuppgifter läsvecka 2

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

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

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

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

OOP Objekt-orienterad programmering

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

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

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

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

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

DAT043 - föreläsning 8

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

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

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

DAT043 - Föreläsning 7

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

Föreläsning 13 Innehåll

Objektorienterad Programmering (TDDC77)

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

TDDC76 - Programmering och Datastrukturer

TDDD78 Objektorientering i Java, del 2

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

Introduktion till arv

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

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

Polymorfi. Objektorienterad och komponentbaserad programmering

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

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

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

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

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

Arv. Objektorienterad och komponentbaserad programmering

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

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

Objektorienterad programmering

Java, klasser, objekt (Skansholm: Kapitel 2)

Föreläsning 9: Arv och UML

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

Kopiering av objekt i Java

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

Objektorienterad programmering med Java, Generics

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

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

Föreläsning REPETITION & EXTENTA

Föreläsning 5-6 Innehåll

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

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

Laboration 1: Figurer i hierarki

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

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

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

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

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

Arv och polymorfism i Java

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

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

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

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

Dynamisk bindning och polymorfism

Laboration 1 - Grunderna för OOP i Java

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

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

Transkript:

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

Diagnostiskt prov Shape + overlaps(shape): int return 1; Shape shape = new Shape(); Polygon tripoly = new Triangle(); Shape trishape = new Triangle(); Triangle triangle = new Triangle(); shape.overlaps(shape); shape.overlaps(triangle); 1 1 Polygon + overlaps(polygon): int + overlaps(shape): int return 2; return ; tripoly.overlaps(shape); tripoly.overlaps(trishape); tripoly.overlaps(tripoly); tripoly.overlaps(triangle); 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 metodsignatur. 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 vilken implementation av en metod(signatur) 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 inte samma signatur! Vilken av signaturerna 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 (signatur) 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. Ex. En Square kan också uppträda som en Polygon eller ett Object.

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 skapade från olika klasser. Variablerna har då olika dynamisk typ vid de olika tidpunkterna. Ex: Shape s = new Triangle(); s = new Rectangle(); 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 (dvs overriding) 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/översiktlig) 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 dessa olika alternativ, och väljer den metod (signatur) 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

Sammanfattning Steg 1 (compile time): Bestäm det implicita argumentets statiska typ: S. Hitta alla signaturer hos S med det metodnamn som anropats. Välj den bästa signaturen av dessa baserat på de statiska typerna hos argumenten. Steg 2 (run time): Bestäm det implicita argumentets dynamiska typ: T. För den signatur som bestämdes i steg 1, hitta den mest specifika implementationen för T. OBS: De dynamiska typerna hos de explicita argumenten är irrelevanta!

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.

Nästa modul (2-2) Arv vs komposition hur och när?