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

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

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

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

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

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

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

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

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

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

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

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

Objektorienterad Programmering (TDDC77)

Classes och Interfaces, Objects och References, Initialization

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

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

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

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

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

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

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

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

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

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

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

DAT043 - Föreläsning 7

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

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

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

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

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

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

DAT043 - föreläsning 8

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

OOP Objekt-orienterad programmering

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

Tentamen Programmering fortsättningskurs DIT950

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

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

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

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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

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

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

OOP Objekt-orienterad programmering

Objektorienterad programmering med Java, Generics

Objektorienterad Programmering (TDDC77)

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

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

Instuderingsuppgifter läsvecka 2

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

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

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

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2016

Laboration 1: Figurer i hierarki

Arv och klassbibliotek

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

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

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

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

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Typecasting - primitiva typer. Innehåll. DoME klasser

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

Objektorienterad Programmering (TDDC77)

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

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

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

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

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

TDDD78 Objektorientering i Java, del 2

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

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

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Sammansatta datatyper Generics: Parametrisk polymorfism

Tentamen. DD2385 Programutvecklingsteknik vt 2015 Fredagen den 5 juni 2015 kl Hjälpmedel: penna, suddgummi, linjal

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

Introduktion och OO. Objekt-orienterad Programmering och Design (TDA552) Alex Gerdes, HT-2018

Objektorienterad Programmering (TDDC77)

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

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

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

Uno Holmer, Chalmers, :17 Uno Holmer, Chalmers, :17

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

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

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

Laboration 1 - Grunderna för OOP i Java

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

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2018

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Konstruktion av klasser med klasser

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

Klasshierarkier - repetition

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

Design Patterns Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

Transkript:

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

Live code

Pair public class Pair<A,B> { private A a; private B b; public A getfirst() { return a; public B getsecond() { return b;

Typ-parametrar och typ-argument A och B kallas typ-parametrar, och Pair är en parameteriserad typ. public class Pair<A,B> { private A a; private B b; public A getfirst() { return a; public B getsecond() { return b; I en konkret användning, e.g. Pair<String,Integer>, är String och Integer typ-argument. Inuti class-bodyn kan A och B användas som om de vore konkreta typer, eftersom de vid varje instansiering kommer att vara det (e.g. String och Integer ovan).

Metod-parametrar och argument Jämför med parametrar och argument till en metod: public void setsize(int x){ this.width = x; myrectangle.setsize(42); x är en parameter till metoden. I ett konkret anrop är e.g. 42 ett argument. I metod-bodyn kan vi använda x som ett konkret expression, eftersom x vid varje anrop kommer att ges ett konkret argument (e.g. 42 ovan).

Live code

Typer för metod-parametrar När vi anger metod-parametrar deklarerar vi deras typ: public void setsize(int x){ this.width = x; Detta gör att vi kan använda dem i vetskapen om att de har de egenskaper och metoder som vi kan förvänta oss av objekt eller värden av den angivna typen.

Typ-parametrar utan typ public class Pair<A,B> { private A a; private B b; public A getfirst() { return a; public B getsecond() { return b; Quiz: Vilka metoder skulle vi kunna anropa på a eller b? Svar: Enbart de som tillhör Object, eftersom Object är en supertyp till allt.

Typ-parametrar med typer Vi kan ange så kallade upper bounds på typ-parametrarna: public class HomogeneousPolygonGroup<P extends Polygon> { private List<P> polygons; public void paint(graphics g) { for (P p: polygons) { p.paint(g); Nu kan vi göra fler antaganden om objekten, eftersom vi vet mer om deras typ. Att försöka skapa e.g. en HomogeneousPolygonGroup<Integer> ger ett statiskt fel.

Upper Bounds Ett upper bound på en typ-parameter ger oss en möjlighet att kontrollera vilka sorts typer vi kan ge som argument. Vi kan ange flera upper bounds med & mellan: public class NumHelper<T extends Number & Comparable<? super T>>{ public static int comparenumbers(t t1, T t2){ return t1.compareto(t2); Om ett av våra bounds är en klass-typ måste denna anges först. I have no idea why Vi kan inte ange lower bounds (super) som vi kan med wildcards (?)

Aside: wildcards Notera skillnaden mellan en typ-parameter och ett wildcard: public class NumHelper<T extends Number & Comparable<? super T>{ public static int comparenumbers(t t1, T t2){ return t1.compareto(t2); En typ-parameter (T) är en variabel som representerar en typ. Vi vet inte vilken typ detta är det bestäms av det argument som ges vid instansiering, och kan vara olika typer olika gånger vi instansierar. Ett wildcard (?) är ett typ-argument som representerar en okänd typ. Vi kommer aldrig veta mer om denna typ än de bounds (upper och lower) som är givna.

Typ-parametrar för metoder Med generics kan vi ge typ-parametrar inte bara till klasser utan även till metoder: public static <T> T head(t[] a){ return a[0]; String[] strings = String x = MyClass.<String>head(strings); Kan utelämnas nästan jämt, typcheckaren kommer hitta rätt typ utifrån användandet (typinferens).

Live code

OPC: The Open-Closed Principle Software modules should be open for extension, but closed for modification. Vårt mål är reusability, extensibility, maintainability. OPC är kärnan i vår metodik för att uppnå detta. Två av våra mest värdefulla verktyg för att uppnå OPC är polymorfism och code reuse.

Polymorfism Generellt brukar man definiera tre olika sorters polymorfism: Parametric polymorphism: En typ (eller metod) kan vara parameteriserad över en annan typ. Den parameteriserade typen (metoden) definierar en struktur (algoritm) som är oberoende av den typ den tar som argument. Subtype polymorphism: Ett objekt av en subtyp kan agera som om det vore ett objekt av en supertyp (superclass eller interface). Ad hoc polymorphism: Olika typer kan oberoende av varandra ge definitioner för samma namn/symbol. (Vissa räknar även så kallad coercion polymorphism, dvs implicita casts mellan typer. Denna form är dock mest syntaktisk convenience, och ger inget extra design-mässigt, så vi bryr oss inte om den.)

Parametric polymorphism En typ (eller metod) kan vara parameteriserad över en annan typ. Den parameteriserade typen (metoden) definierar en struktur (algoritm) som är oberoende av den typ den tar som argument. Historiskt brukar detta inom den funktionella sfären (e.g. Haskell) helt enkelt kallas polymorfism. Java Generics ger parametric polymorphism till Java (sen Java 5, 2004). Ger oss möjlighet att återanvända samma struktur för många olika typer: Pair<String,Integer> p1 = Pair<? extends Number, Polygon> p2 = Ger automatisk code reuse genom att vi återanvänder koden för strukturen.

Subtype polymorphism Ett objekt av en subtyp kan agera som om det vore ett objekt av en supertyp (superclass eller interface). Historiskt brukar detta inom den objekt-orienterade sfären helt enkelt kallas polymorfism, eftersom det länge varit den enda och förhärskande formen. Ger oss möjlighet att betrakta objekt av olika typer som om de hade samma typ, genom att enbart titta på ett gemensamt publikt gränssnitt: for (Polygon p : polygons) { p.paint(g); Ger code reuse via direkt arv (subclassing), eller genom implementation av interface via delegering.

Ad hoc polymorphism Olika typer kan oberoende av varandra ge definitioner för samma namn/symbol. Exempel: Operator overloading i C#, type classes i Haskell. Betrakta följande funktion (pseudokod): add(x,y) = x + y; Vilka argument kan ges till add? Om språket har ad hoc polymorphism för operatorn +, kan helt enkelt värden av alla typer som ger en definition av + ges som argument: <T implements +> T add(t x, T y) = x + y; Ger ingen code reuse hela poängen är att operatorn eller metoden definieras separat för varje typ. Java har inte ad hoc polymorphism. OBS! Inte korrekt Java-kod

Subtype vs Ad hoc polymorphism Subtype polymorphism och Ad hoc polymorphism har klara likheter. Betänk följande interface i Java: public interface Adder { public add(adder x); Alla typer som implementerar interfacet ovan gör det separat. Kod som använder metoden add kan användas för alla dessa typer. Det som gör att vi betraktar detta som subtype polymorphism, och inte ad hoc, är att vi samtidigt definierar en typadder. Skillnaden är närmast filosofisk, men har konkret påverkan på olika språk-features: E.g. vi kan inte skapa listor av objekt av typer som implementerar + i C#, eller listor av värden av typer som implementerar Eq i Haskell.

Subtype vs parametric polymorphism Parametric polymorphism och subtype (och ad hoc) polymorphism har stora olikheter: Subtype polymorphism handlar om att konkreta objekt uppträder på samma sätt (cf. Liskov Substitution Principle), och därför kan användas i varandras ställe. Code reuse åstadkoms genom att subklasser ärver från superklasser. Parametric polymorphism handlar om att definiera kod som är oberoende av en underliggande typ. Denna kod kan då återanvändas i alla konkreta instansieringar av typen. Olika instansieringar av samma parameteriserade typ kan inte användas i varandras ställe. Slutsats: De olika formerna av polymorfism har helt olika användningsområden. De samspelar, men fyller olika funktion, därav att Java (och många andra språk) har båda formerna.

Polymorfism och variance Konceptet variance (se tidigare föreläsning) uppstår i samspelet mellan subtyping och parameteriserade typer. E.g. om A <: B, hur förhåller sig då P<A> till P<B>? Metodsignaturer är E.g. om CatShelter är en subtyp till AnimalShelter, hur förhåller sig då putanimal och adoptanimal i CatShelter till motsvarande i AnimalShelter? public class AnimalShelter { public void putanimal(animal a){ public Animal adoptanimal(){ Vilka typer är ok för putanimal i CatShelter att ta som argument? Vad är ok för CatShelter att definiera som returtyp för adoptanimal?

Metoder och variance Generellt i Java gäller: metoder är covarianta i sin returtyp, och invarianta i sina argumenttyper. Vi skulle kunna tillåta contravarianta argumenttyper vissa språk gör det men Java (och e.g. C#) betraktar det som overloading om vi varierar argumenttypen åt något håll. public class CatShelter extends AnimalShelter { public void putanimal(cat a){ public Cat adoptanimal(){ Ok: Cat <: Animal, dvs covariance Detta ger overloading: putanimal kan inte vara covariant i sin argumenttyp

Live code

What s next Block 4-2: Dependencies Can t live with em, can t live without em