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

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

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

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

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

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

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

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

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

Objektorienterad Programmering (TDDC77)

DAT043 - föreläsning 8

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

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

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

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

DAT043 - Föreläsning 7

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

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

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

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

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

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.

OOP Objekt-orienterad programmering

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

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

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

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

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

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

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

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

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

Instuderingsuppgifter läsvecka 2

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

Tentamen Programmering fortsättningskurs DIT950

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.

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

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

Arv och klassbibliotek

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

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

Laboration 1: Figurer i hierarki

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

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

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

Kopiering av objekt i Java

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

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

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

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

Observer Pattern och MVC. 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

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

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

Objektorienterad Programmering (TDDC77)

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

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

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

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

Sammansatta datatyper Generics: Parametrisk polymorfism

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

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

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

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

TDDD78 Objektorientering i Java, del 2

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

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

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

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

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

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

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

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

Konstruktion av klasser med klasser

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

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

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

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

Transkript:

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

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 vara 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 alla egenskaper och metoder vi förväntar 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 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).

Typ-parametrar och scope Parameteriserar MyClass på T. Binder T i klassdefinitionen Instantiera YourClass med <T> Binds av MyClass<T> Binder in i metoddefinitionen, Överskuggar MyClass<T> från klassdefinitionen public class MyClass<T> extends YourClass<T> { private T t; private List<T> t; public <T> T id(t t) { return t; public T gett() { return t; Instantiera List med parameter <T> Notationen <T> används för två olika saker: Parametrisera typer (bindande förekomster) Instantiera typer (bundna förekomster)

Live code

OCP: The Open-Closed Principle Software modules should be open for extension, but closed for modification. Vårt mål är reusability, extensibility, maintainability. OCP är kärnan i vår metodik för att uppnå detta. Två av våra mest värdefulla verktyg för att uppnå OCP ä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 syntaktiskt socker, 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: OBS! Inte <T implements +> T add(t x, T y) = x + y; korrekt Java-kod Ger ingen code reuse hela poängen är att operatorn eller metoden definieras separat för varje typ. Java har inte ad hoc polymorphism.

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 typ Adder. 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- och subtype- (och ad hoc-) polymorphism har stora olikheter: Subtype polymorphism: konkreta objekt uppträder på samma sätt och kan användas i varandras ställe. Code reuse åstadkoms genom att subklasser ärver från superklasser. (cf. Liskov Substitution Principle) Parametric polymorphism: definierar kod som är oberoende av en underliggande typ. Koden kan å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 covariant i sin returtyp, och invariant i sina argumenttyper. Vi skulle kunna tillåta contravariant 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