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

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

TDDD78 Objektorientering i Java, del 2

TDDD78 Objektorientering i Java, del 3. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

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

Viktiga programmeringsbegrepp: Kontrakt

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

Sammansatta datatyper Generics: Parametrisk polymorfism

TDDD78, TDDE30, 729A Typhierarkier del 3 När och hur vill vi använda dem? Några Best Practices

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

Objektorientering: Lagring och livstid

TDDD78 Viktiga begrepp, del 2

Objektorientering: Lagring, räckvidd och livstid

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

TDDD78 Objektorientering i Java, del 2

OOP Objekt-orienterad programmering

TDDD78 Objektorientering i Java, del 3

TDDD78 Objektorientering: Lagring och livstid

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

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

Sammansatta datatyper Generics: Parametrisk polymorfism

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

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

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

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

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

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

Objektorienterad Programmering (TDDC77)

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

Klasshierarkier - repetition

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Introduktion till arv

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

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Laboration 1: Figurer i hierarki

Arv och klassbibliotek

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

DAT043 - Föreläsning 7

Objektorienterad programmering. Grundläggande begrepp

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

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

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

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

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

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

Instuderingsuppgifter läsvecka 2

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

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

Classes och Interfaces, Objects och References, Initialization

TDDD78, TDDE30, 729A85 Objektorienterad programmering och Java

DAT043 - föreläsning 8

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

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

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

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

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

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

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

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

LÖSNINGSFÖRSLAG TENTAMEN

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

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

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

Dynamisk bindning och polymorfism

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

TDDD78 Introduktion till OOP i Java

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

OOP Objekt-orienterad programmering

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

Variabler, värden och typer

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Arrayer. results

Konstruktion av klasser med klasser

TDDD78, TDDE30, 729A85 Objektorienterad programmering och Java

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

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

TDDD78, TDDE30, 729A Grafik: Att "rita" egna komponenter

Polymorfi. Objektorienterad och komponentbaserad programmering

Arv. Objektorienterad och komponentbaserad programmering

Repetition av OOP- och Javabegrepp

Tommy Färnqvist, IDA, Linköpings universitet

Mer OOP. Variation i typ. Medlen repetition. Generiska klasser. Gränssnitt - Interface. Mer om klasser Några exempel UML

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

Repetition av OOP- och Javabegrepp

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

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

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

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

Klasshierarkier. Klasser kan byggas på redan definierade klasser

TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?

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

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

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

Tillämpad Programmering (ID1218) :00-13:00

Transkript:

TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2019 Typhierarkier del 2 Vad krävs? Hur fungerar det?

Hur får en subtyp fungera egentligen?

Krav på hierarkier 1 3 Får subtypen LinkedList sakna metoder från List?

Krav på hierarkier 2 4 Om List.add() lägger till sist i listan, får LinkedList.add() lägga till först?

Krav på hierarkier 3 5 Även har ett kontrakt En är en måste uppfylla samma kontrakt! (Alla fåglar har fjädrar, ankor är fåglar alla ankor har fjädrar) Subtypens eget kontrakt får bara: Lova mer ge starkare garantier (ankor kan kvacka också) Kräva mindre ha svagare krav Det är detta som garanterar: Om vi accepterar en, är vi nöjda med vilken subtyp som helst!

Krav på hierarkier 4: LSP 6 En formell beskrivning: Liskov Substitution Principle Let q(x) be a property provable about objects x of type T. Then q(y) should be provable for objects y of type S, where S is a subtype of T. Om vi kan bevisa något om alla List-objekt, måste detta även gälla för alla LinkedList-objekt. Barbara Liskov

Specialfall: Kovarianta returtyper! 7 LSP säger: Subtypens eget kontrakt får bara: Lova mer ge starkare garantier Kräva mindre ha svagare krav Java låter subklasser stärka löftet om returtyp Jag lovar att det är en lista det är till och med en ArrayList! Varierar "åt samma håll" (en specialisering av List specialiserar även returtyperna) kovariant

Hur fungerar typhierarkier tillsammans med manifest typning? Vilken typ har ett objekt? Eller vilka typer?

Objekt med flera typer 9 Ett objekt har nu flera typer Varje är också av typen och Vilka effekter får det?

Peka på en subtyp ett par frågor 10 En objektvariabel kan peka på objekt av godtycklig subtyp kan bara peka på -objekt Och en är ju en! Så vilken typ har variabeln egentligen? En objektvariabel kan pekas om till ett objekt av annan typ Så kan variabler byta typ?

Typer: Apparent / Actual Med typhierarkier: Variabel av typ Känt av kompilatorn 11 Variabelns typ kallas static / apparent type get() add() (no impl) (no impl) Statiskt: Variabelns typ är oföränderlig get() add() print() Värdet vid exekvering blir av typen [LL-get] [LL-add] [ ] Generellt bara känt vid körning Kan ändras under körning Objektets typ kallas dynamic / actual type

Dynamisk typ: Inte känd före körning 12

Synliga (tillgängliga) medlemmar 13 Givet en variabel, vilka metoder och fält är synliga? Variabel av typ get() add() (no impl) (no impl) I Java: De som finns i variabelns (uttryckets) typ! windows.get(), windows.add() get() add() print() Värdet vid exekvering blir av typen [LL-get] [LL-add] [ ] Kompilatorn vet inte att värdet kommer att vara en LinkedList Vi kan inte anropa windows.print()!

Statisk typkontroll 14 Så typkontrollen är fortfarande statisk

Vem vet mest? 15 Men tänk om vi vet mer än kompilatorn! Vi har listor av fåglar Vi stoppar in något först i listan Vi plockar ut det Men vi vet ju vad vi stoppade in där!

Att veta mer (2) 16 Vi kan tala om för kompilatorn vad vi vet! Använd en cast Denna cast är ett löfte: Fågeln är faktiskt en uggla!" Resultatet är en ny pekare till samma objekt Inte ett nytt "konverterat" objekt! Om man ljuger: (här finns dynamisk typkontroll, dvs. vid körningen!)

Hur fungerar egentligen overriding? Hur anropas rätt implementation? Vad är rätt implementation?

Namnbindning 18 Namnbindning: Givet en identifierare (namn), vilken variabel / fält / metod / menar vi? För variabler tar kompilatorn reda på detta: Detta är statisk bindning = tidig bindning: Sker före programmet körs

Bindning av metoder 19 Att binda metodnamn till implementation: Utan typhierarkier (annat språk) Variabelns typ = objektets typ Statisk bindning är möjlig Med typhierarkier (Java) Variabelns typ!= objektets typ Dynamisk bindning krävs Vilken variant av add()? Måste vara ArrayList:s! Känt vid kompileringen: Namnet add() kan statiskt bindas till en funktion av kompilatorn Vilken variant av add()? ArrayList:s? LinkedList:s? Okänt vid kompileringen: Namnet add() måste dynamiskt bindas till en funktion vid körning

Metodtabeller Varje objekt känner till sin klass Varje klass känner till sin metodkod 20 Klassinfo med metodtabell Virtual method table: vtable get() add() print() [LL-get] [LL-add] [ ]

Dynamisk bindning 21 Dynamisk bindning = sen bindning = dynamisk dispatch Objektets typ avgör Objektet talar (indirekt) om för oss var implementationen finns: get() add() print() [LL-get] [LL-add] [ ] get() add() [AL-get] [AL-add]

Subtypspolymorfism 22 Typhierarkin + sen bindning ger oss Subtypspolymorfism πολυμορφισμός = som har flera former Här: Ett metodnamn, deklarerat i en typ Flera implementationer, skrivna i subtyperna Kallas ofta enbart "polymorfism" men polymorfism är egentligen bredare begrepp

Overloading 23 Kontrasteras med överlagring = ad-hoc-polymorfism Samma namn, flera implementationer (för olika argumenttyper) Inte ett OO-begrepp mer allmänt! Alla varianter är kända vid kompileringen Ger statisk bindning

Motivation 25 Klasshierarkin ska grundas i begrepp, klassificering Naturligt att prata om listor i allmänhet ge flera implementationer X är en speciell sorts Y, som Naturligt att prata om grafiska komponenter i allmänhet Vissa komponenter är knappar Vissa komponenter är textfält Men ibland vill vi också undvika redundant kod! (Vanligt problem i projekt )

Motivation 2: Duplicerad kod 26 A lot of common code! length field size(), indexof() Massor av duplicerad kod Hur kan vi använda samma kod för båda klasser? Inte flytta till List: Gränssnitt ska ange krav, inte implementation

Försök 1: Återanvända med konkret klass? 27 Bra försök, men skulle behöva implementera!

Försök 2: Dummy-implementation? 28 Bra försök, men skulle inte uppfylla kraven på : get ska returnera rätt element!

Abstract 1: Intro 29 Vi vill ha en klass, där: Vissa metoder ska implementeras Andra metoder ska krävas, men inte implementeras Klassen blir ofullständig, ungefär som gränssnitt Partiellt implementerad Kallas abstrakt existing in thought or as an idea but not having a physical or concrete existence Mest för att undvika redundant kod!

Ärver löften/kod från GenericList Implementerar det som saknas Abstract 2: För återanvändning! 30 Ärver löften från List Saknar ändå get(), add, set()

Abstract 3: Gå hela vägen! 31 Relaterat problem i projekt: Ärvningen finns där, men medlemmar repeteras ändå! Flytta till superklassen!

Abstract 4: Varning för upprepning 32 Relaterat problem i projekt: Ärvningen finns där, men fält repeteras ändå! Ger skuggning av fält: Varje ArrayList har TVÅ fält med namnet length Vilket som används beror på pekartypen Slösar minne Svårt att förstå!

Abstract 5: Instansiering 33 Kan inte instansieras med Kan bara skapa konkreta objekt Men vi kan skapa, vilket ger en sorts GenericList!

Abstract 6: Konstruktorer 34 Även en abstrakt klass ska initialisera sina objekt Det finns fält (som ärvs av ArrayList, ) Initialiseras i en konstruktor: Klassen bestämmer över sina objekt

Abstract 7: Protected 35 Konstruktorer i abstrakta klasser bör vara protected: Tillgängliga i subklasser (enda som kan anropa dem!)

Abstract 8: Begrepp? 36 Abstrakta klasser: Kan vara ett undantag från begreppsmodelleringen Inget behov att prata om GenericList: Då räcker det med List Men vi vill samla gemensam kod

Sammanfattning TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2018

Sammanfattning: Klasshierarkier 38 2. Ett gränssnitt kan ärva från och utöka (löftena som gavs av) ett annat gränssnitt 1. Ofta (men inte alltid) har vi en mängd gränssnitt som definierar funktionalitet och ger löften (kontrakt), bland annat genom att ange abstrakta metoder

Sammanfattning: Klasshierarkier (2) 39 3. En metod kan ta "godtycklig Collection" som parameter 2. En metod kan ta godtycklig List som parameter. Kan vara en SkipList eller CheckedList spelar ingen roll! 4. En klass kan implementera flera gränssnitt. Ingen tvetydighet, eftersom ingen kod ärvs. 1. Klasser kan implementera gränssnitt måste uppfylla deras kontrakt

Sammanfattning: Klasshierarkier (3) 40 1. Abstrakta klasser (GenericList) can tillhandahålla partiella implementationer där vissa metoder är abstrakta ("löften" att metoden ska finnas) 2. och kan ha konkreta subklasser som implementerar den saknade funktionaliteten

Sammanfattning: Klasshierarkier (4) 41 En del klasser, som MyList, implementerar inga gränssnitt alls

Sammanfattning: Klasshierarkier (5) 42 men alla klasser utökar (direkt eller indirekt) java.lang.object!

Varning: Ska användas mycket sparsamt!

Typkontroll: Operatorn instanceof 44 Vilken typ har ett visst objekt? Exakt typ: Subtyp: Allt är!

Typkontroll: Operatorn instanceof (2) 45 Kan användas för att göra olika saker beroende på typ För alla Thing-objekt t i samlingen thingsonscreen

Typkontroll: Operatorn instanceof (3) 46 Kan användas för att göra olika saker beroende på typ Göra olika beroende på typ? Det är ju detta subtypspolymorfism är till för! UNDVIK! Polymorfism är oftast bättre! Från Effective C++, av Scott Meyers : "Anytime you find yourself writing code of the form if the object is of type T1, then do something, but if it's of type T2, then do something else, slap yourself. "

Vad är problemet? 47 Single Responsibility Principle: Kollisionshanteraren borde inte bestämma hur alla saker på skärmen interagerar med spelaren! Centraliserat: Lägger man till en ny sorts Thing, måste denna metod också ändras! Bräckligt, inte modulärt!

Varför är polymorfism (oftast) bättre? 48 1. Be saken hantera detta 2. Thing lovar att alla Thing-klasser kan hantera kollision 4. Polymorfism och dynamisk bindning rätt implementation väljs! 3. Alla Thing-klasser har sin egen implementation, bestämmer sitt beteende

Icke-lösningar på problemet 49 Ingen instanceof, men samma problem Problemet är typkontrollen, inte instanceof Be objektet använd polymorfism