Generic type declarations. 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

Generics och polymorfism. 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

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

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

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

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

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

DAT043 - föreläsning 8

Objektorienterad Programmering (TDDC77)

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

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

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

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

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

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

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

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

Sammansatta datatyper Generics: Parametrisk polymorfism

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

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

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

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

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

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

Objektorienterad Programmering (TDDC77)

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

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

Repetition av OOP- och Javabegrepp

Typecasting - primitiva typer. Innehåll. DoME klasser

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

Arv och klassbibliotek

Repetition av OOP- och Javabegrepp

Objektorienterad Programmering (TDDC77)

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

OOP Objekt-orienterad programmering

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

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

Instuderingsuppgifter läsvecka 2

DAT043 - Föreläsning 7

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

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Generisk klass med typparameter Inre klass - ListIterator

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

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

Länkade strukturer, parametriserade typer och undantag

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

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

Klasshierarkier - repetition

Laboration 1 - Grunderna för OOP i Java

Sammansatta datatyper Generics: Parametrisk polymorfism

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

Tentamen Programmering fortsättningskurs DIT950

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

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

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

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

Objektorienterad Programmering (TDDC77)

Arv. Objektorienterad och komponentbaserad programmering

Funktionell programmering DD1361

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

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

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

OOP Objekt-orienterad programmering

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

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

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

TENTAMEN OOP

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

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

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

Föreläsning 15: Repetition DVGA02

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

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

Kopiering av objekt i Java

Dynamisk bindning och polymorfism

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

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

TDDD78 Viktiga begrepp, del 2

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

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

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

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

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

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

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

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

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

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

Transkript:

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

Polymorfism Polymorfism är värdefullt ger hög grad av reuseability och extensibility. You know this by now I Java finns två sorters polymorfism: 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 varit den enda och förhärskande formen. 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). (I vissa språk finns även en tredje form: Ad hoc polymorphism: Olika typer kan oberoende av varandra ge definitioner för samma namn/symbol. E.g. typklasser i Haskell, operator overloading i C#.)

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

Parametric polymorphism för 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).

Parametric polymorphism för klasser Ni har redan sett och använt instanser av parameteriserade typer i former av Collections: Collection<T>, ArrayList<T>, Deque<T>, etc. Parameteriserade typer har många fler användningar än för collections, e.g.: Utility-gränssnitt som kan specialiseras till en viss typ (Iterable<E>, Comparable<E>, ) Funktions-gränssnitt (Function<T,R>, BinaryOperator<T>, Predicate<T>, ) Wrapper-klasser (JLayer(V extends Component), )

Definiera parameteriserade typer Introducera en typ-parameter Inom klassen, använd som om den vore en typ. public class MyClass<T>{ T t; public MyClass(T t){ this.t = t; } public T getit(){ return t; } } MyClass<String> mystring = new MyClass( Get it? ); String gotit = mystring.getit();

Övning Börja från koden som finns att ladda ner från hemsidan. Färdigställ implementationen av klassen Tuple. Tanken är att den ska fungera som en tupel i e.g. Haskell eller Python. Den ska hålla två värden av (potentiellt) olika (godtycklig) typ, och ha metoderna fst() och snd() för att returnera första respektive andra komponenten. Titta på koden för AnimalShelter med tillhörande kring-klasser. Kika särskilt på ShelterError. Hur kan vi tänka om, så att det inte är möjligt att sätta hundar i ett katt-hem, och vice versa, utan att förlora code reuse eller extensibility? Vi vill få ett statiskt felmeddelande, inte ett fel (exception) vid runtime. Färdigställ implementationen av interfacet Function. Tanken är att det ska representera funktioner från argument av någon typ T till resultat av någon typ R. Interfacet ska ha metoderna compose, som sätter ihop två funktioner av lämpliga argument- och retur-typer, samt apply, som applicerar funktionen på ett lämpligt argument. Hur kan ni göra metoderna så polymorfa som möjligt? För utmaning: färdigställ implementationen av klassen Either<A,B>. Tanken är att den ska fungera som typen Either i Haskell. Den ska representera antingen ett objekt av typen A (annoterat Left) eller ett objekt av typen B (annoterat Right), och ha metoderna isleft() och isright(). Den ska också ha metoden either med motsvarande signatur (A -> R) -> (B -> R) -> R (fast uttryckt på Java-vis). För extra utmaning: Ge en default-implementation av metoden Function.compose från ovan (Obs! Kräver kännedom om Lambdas!).