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

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

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

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

TDDD78 Objektorientering i Java, del 2

TDDD78 Objektorientering i Java, del 3

Sammansatta datatyper Generics: Parametrisk polymorfism

Objektorientering: Lagring och livstid

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!

TDDD78 Viktiga begrepp, del 2

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

OOP Objekt-orienterad programmering

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

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

Objektorientering: Lagring, räckvidd och livstid

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 13 Innehåll

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

Laboration 1: Figurer i hierarki

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

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 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 arv

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

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

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

Objektorienterad Programmering (TDDC77)

Klasshierarkier - repetition

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

Arrayer. results

Konstruktion av klasser med klasser

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

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

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

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

Repetition av OOP- och Javabegrepp

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

DAT043 - Föreläsning 7

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

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

Repetition av OOP- och Javabegrepp

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

Instuderingsuppgifter läsvecka 2

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

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

Sammansatta datatyper Generics: Parametrisk polymorfism

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

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

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

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

Övningar Dag 2 En första klass

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

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

OOP Objekt-orienterad programmering

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

Lösningar till tentamen i EDAF25

Viktiga programmeringsbegrepp: Kontrakt

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

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

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

TDDD78 Introduktion till OOP i Java

TDDD78, TDDE30, 729A85 Objektorienterad programmering och Java

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

Objektorienterad programmering. Grundläggande begrepp

DAT043 - föreläsning 8

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

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

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

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

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

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

Dynamisk bindning och polymorfism

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

TDDD78 Introduktion till OOP i Java

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

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

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

LÖSNINGSFÖRSLAG TENTAMEN

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

TENTAMEN OOP

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

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

Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

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

Monday, November 16, Senaste Labben

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

Transkript:

Ärvning av implementation Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva? TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2018

Implementationsarv 1: Klassnivåer 2 Nu kan vi ha godtyckligt antal nivåer men bara en klassnivå. Vill vi ha mer? Varför?

Implementationsarv 2: Nya medlemmar 3 En anledning: Addera egenskaper + funktionalitet till en klass Vill ibland lagra geometriska cirklar x y radie Ha kvar rena cirklar: Geometriklasser ska bara ha geometri, renare design Lägre minnesåtgång Kommer från klassbibliotek, kan inte ändras Vissa ska vara grafiska Outlinefärg Fyllfärg Ritmetod Utökad version!

Implementationsarv 3: Nya medlemmar 4 Adderar Ärver Ärver Adderar GraphicCircle utökar eller ärver från Circle GraphicCircle är en subklass till Circle Circle är en superklass till GraphicCircle

Implementationsarv 4: Visualisering 5 getcircum getarea setradius code code code getcircum getarea setradius draw code code code code

Implementationsarv 5: Overriding 6 Anledning 2: Ändra eller utöka nedärvd funktionalitet Kan override:a ("ersätta") metoder: Ge dem en ny implementation Fråga superklassen vad den tycker Kräver identiska parametertyper annars blir det overloading

Implementationsarv 6: super() 7 Modellering med super() 3. skulle vi inte få med framtida ändringar i Circle:s isvalid()! 2. Om vi istället skrev här: if (r < 0) return false; 1. Modellering: Inte bara bekvämlighet Superklassen vet när dess fält är giltiga vi måste fråga den! Sedan kan vi gå vidare med vårt ansvarsområde

UML-klassdiagram: Generalisering 8 Klassrelation: Generalisering (ärvning) Som för gränssnitt

Annoteringar vid overriding 9 Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av IDEA Den här implementationen ersätter en annan! Stava fel, använd fel typer, ta bort get() från superklassen kompileringsfel!

Multipel ärvning? 10 Multipel ärvning i vissa språk: Utöka flera klasser Användbart och förvirrande Om båda superklasser har implementerat Vilken implementation ska ärva? Förbjudet i Java

Rötter i klasshierarkin 11 I vissa språk har klasshierarkin flera rötter Vissa klasser är relaterade via ärvning, andra fristående Java: Allt går tillbaka till Object!

Enkelrotad klasshierarki 12 Utan extends Med extends Så småningom kommer vi till Object! Fördel: En Object-variabel kan peka på vilket objekt som helst Användbart i generella datatyper Set, List, Vet inte typen av element i förväg

Konstruktorer och arv 1 14 Först: minnesallokering, defaultvärden, för alla fält Ingen får komma åt "gammalt skräp" Sedan släpps konstruktorer in: -delen "konstruerar sig" Kryss = null (pekar ingenstans) -delen "konstruerar sig" I vilken ordning? Superklassen först Ingen får komma åt -fälten (x,y,r) innan initialiserat dem Inte ens dess egen subklass!

Konstruktorer och arv 2 15 Men vi anropade ju Det första GraphicCircle gör: Anropa superklassens konstruktor Circle får initialisera sig Sedan får GraphicCircle sin chans att titta på objektet Sedan får vi objektet från konstruktorn, och kan titta på det Strunta i super( ) kompilatorn stoppar in super() utan argument Men Circle() finns inte: Kompileringsfel!

Konstruktorer: Skicka vidare! 16 Glöm inte att skicka vidare parametrar! Ibland ser vi följande: Tom Circle-konstruktor Anropar tom Circle-konstruktor Petar själv in värden i Circle-delen Dålig modellering! Circle får inte bestämma över sig själv Kan inte validera sina parametrar, Kan inte ändra sin implementation Upprepad kod i alla Circle-subklasser

Konstruktorer: Försvara klassen! 17 Se till att Circle kan försvara sig! Skapa bara konstruktorer som kräver rätt argument Underklasser kan inte låta bli att skicka x, y, r

Motivation 19 Klasshierarkin ska oftast 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 helt enkelt undvika redundant kod! (Vanligt problem i projekt )

Motivation 2: Duplicerad kod 20 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? 21 Bra försök, men skulle behöva implementera!

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

Abstract 1: Intro 23 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 jonkv@ida Abstract 2: För återanvändning! 24 Ärver löften från List Saknar ändå get(), add, set()

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

Abstract 4: Varning för upprepning 26 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 27 Kan inte instansieras med Kan bara skapa konkreta objekt Men vi kan skapa, vilket ger en sorts GenericList!

Abstract 6: Konstruktorer 28 Ä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 29 Konstruktorer i abstrakta klasser bör vara protected: Tillgängliga i subklasser (enda som kan anropa dem!)

Abstract 8: Begrepp? 30 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

Abstrakt klass eller gränssnitt? (1) 32 Gränssnitt Kan implementera flera Ingen kod, bara löften / kontrakt Kan vara både List och Queue Alla som implementerar måste ha kod för alla metoder kan ta godtycklig Vem som helst kan implementera Även om man också implementerar eller utökar en klass Gränssnitt ger ingen gemensam kod att ärva

Abstrakt klass eller gränssnitt? (2) 33 Abstrakta klasser Ger löften och kod Kan bara utöka en Klasser tillhandahåller kod som alla subklasser använder Ingen klass kan vara Reader och InputStream Subklasser till och ärver användbar kod

Abstrakt klass eller gränssnitt? (3) 34 Javas I/O-klasser har suboptimal design "Basen" i dessa hierarkier är abstrakta klasser, inte gränssnitt I/O-kod deklarerar parametrar, fält, variabler av klasstyperna och! För att skapa en ny strömtyp som metoden kan använda, måste man utöka InputStream Då kan klassen inte utöka något annat Hade List och Queue varit abstrakta klasser, kunde LinkedList inte ha varit både List and Queue!

Abstrakt klass eller gränssnitt? (4) 35 Bra teknik: Använd båda! Hierarkiernas "baser" är gränssnitt (List, Queue) används för deklarationer etc. Man kan implementera dessa direkt full frihet Om man har mycket gemensam kod, och kan tjäna på att ha en abstrakt klass

Abstrakt klass eller gränssnitt? (5) 36 Kan man bara "stoppa in" en abstrakt klass! Metoder kräver/returnerar fortfarande List, inte AbstractList kan ta/returnera en CheckedList skriven utan den abstrakta klassen

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!

TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2018 Att använda ärvning eller inte

Personer 1: Klasser 45 Vi vill ha en persondatabas för universitetet Ett sätt att modellera: En klass för varje typ av person Problem: Doktorander är både anställda och studenter

Personer 2: Gränssnitt 46 OK, vi använder gränssnitt multipel ärvning! Problem: Hur byter man typ?

Personer 3: Byta typ 47 Många personer byter typ under sin livstid Student doktorand postdoktor lektor professor? Objekt kan inte byta typ Vi måste skapa nytt objekt Praktiskt problem: Det gamla objektet kan lagras på många platser Måste bytas ut mot det nya, överallt Begreppsproblem: Jag byttes inte ut mot en ny person!

Personer 4: Alternativ klassificering 48 Varför dela upp enligt just anställningsform? Andra klassificeringar: Prefekt, dekan, rektor en roll som en professor kan ha Medlem i utbildningsnämnd, eller inte? Medlem i institutionsstyrelse, eller inte? Ska allt detta motsvaras av egna gränssnitt?

Personer 4: Annan lösning 49 Försök inte tvinga in ärvning för ärvningens skull! Alternativ lösning: Anställningsform är en egenskap som kan ändras En eller flera roller, kan också ändras (Överkurs: Nästlad enum-klass fullständigt namn, användbart när en klass tydligt tillhör en annan)

Schack: En kontrast 50 Schackspel: Kan ha flera klass för pjäser: Varje pjäs har en typ Eget beteende (förflyttningsregler), kanske tillräckligt komplext för egen klass Pjäser byter sällan typ kan enkelt hanteras Nya typer tillkommer aldrig Kan välja att ha en klass Avvägning: Vilket blir mest läsbart, modulärt? Inte separata klasser för vitt/svart alltför lika beteende

Om du bara har en hammare, ser alla problem ut som spikar Men vi har flera verktyg än ärvning!

Skapa inte klasser för klassernas skull

Onödiga klasser 1.1 53 Subklasser ska ha eget beteende: Nya eller ändrade metoder! Här skiljer sig bara konstruktorn Inget beteende, bara data (värden) Dålig lösning: Onödiga klasser Kan anropa med parametrar slipper två klasser fördelar i flexibilitet

Onödiga klasser 1.2: Fabriksmetoder 54 Om man ändå vill ge namn för att förenkla: Använd fabriksmetoder Behöver inte alltid en egen "fabriksklass" Anropas * bara från? Då kanske de ska ligga i istället

Onödiga klasser 2.1 55 Här finns metoder med olika kod Men den enda skillnaden är i värden! Ska inte ha olika klasser

Onödiga klasser 2.2: Lösning 56 Bra, generell lösning: Kan lätt ange godtycklig hopplängd Kan hitta på hopplängder under programmets körning (ingen ny klass krävs) Använd inte klasser när värden räcker

Att vara eller icke vara 58 Är den, eller har den? Gör vi så här, ärver Circle funktionalitet från Point Trevligt! Gratismetoder! Är en cirkel en sorts punkt? Nej!

Att vara eller icke vara (2) 59 En cirkel har en punkt mittpunkten Vill vi erbjuda liknande metoder? Delegera!

Att vara eller icke vara (3) 60 Är den, eller har den? Gör vi så här, ärver Queue funktionalitet från ArrayList Trevligt! Gratismetoder! Är en kö en sorts lista? Nej! Listor kan stoppa in element var som helst, ta bort var som helst, En kö kan ha en lista (se labbar)

Om du bara har en hammare, ser alla problem ut som spikar Använd komposition när det passar!

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

Typkontroll: Operatorn instanceof (2) 64 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) 65 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? 66 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? 67 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 68 Ingen instanceof, men samma problem Problemet är typkontrollen, inte instanceof Be objektet använd polymorfism