Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar Telefon Andreas Hedrén Telefon Föreläsning 9, Kapitel 9
Centrala delar Polymorfism Statisk och dynamisk typ Overriding Protected som synlighet
Arvshierarki
Olika utskrifter CD: A Swingin' Affair (64 mins)* Frank Sinatra tracks: 16 my favourite Sinatra album video: The Matrix (136 mins) Andy & Larry Wachowski must see if interested in virtual reality! title: A Swingin' Affair (64 mins)* my favourite Sinatra album title: The Matrix (136 mins) must see if interested in virtual reality! Vad vi vill ha Vad vi har
Problem Metoden print hos Item skriver endast ut gemensamma fält Arv går bara åt ett håll: –En underklass ärver överklassens variabler –Överklassen känner inte till underklassens variabler
Försök att lösa problemet Placera metoden print där den har tillgång till nödvändig information Varje underklass har sin egen version av metoden Men variablerna hos Item är privata Klassen Database kan inte hitta metoden print hos klassen Item.
Statisk och dynamisk typ En mer komplex hierarki behöver ytterligare koncept Ny terminologi: –Statisk typ –Dynamisk typ
Statisk och dynamisk typ Car c1 = new Car(); Vad har c1 för typ? Vehicle v1 = new Car(); Vad har v1 för typ?
Statisk och dynamisk typ En variabels deklarerade typ är dess statiska typ Den typ av objekt som variabeln refererar till är dess dynamiska typ Kompilatorns jobb är att kontrollera så att vi inte gör fel med statiska typer Item item = (Item) iter.next(); item.print(); // Compile-time error.
Overriding: Lösningen Metoden print finns i både över- och underklassen Tillfredställer kontroll av både statisk och dynamisk typ
Åsidosättande - Overriding Över- och underklass definierar metoder med samma deklaration Metoderna har tillgång till variablerna i den egna klassen Överklassen ser till att vi får statisk typkontroll Underklassens metod anropas när programmet körs – den sätter sig över (overrides) överklassens version Vad händer med överklassens version?
Anropa rätt metod Inget arv eller polymorfism Den enda möjliga metoden anropas
Anropa rätt metod Arv men inte overriding. Söker efter en metod genom att starta nerifrån och gå uppåt till en matchande metod hittas
Anropa rätt metod Polymorfism och overriding. Den första versionen som hittas används
Anropa rätt metod 1.Variabeln används 2.Objektet som variabeln refererar till hittas 3.Objektets klass hittas 4.Klasser genomsöks efter en matchande metod 5.Om ingen matchande metod hittas söks klassens överklass igenom Detta upprepas till en matchande metod hittas eller tills det inte längre finns några överklasser i hierarkin Overriding metoder går före överklassens
Att använda nyckelordet super Metoder i överklasser som är overridden i underklasserna är gömda …... men vi vill ibland kunna anropa de En metod som är overridden kan anropas genom att använda nyckelordet super: –super.method(...) –Jämför med användandet av super i konstruktorer
Anropa en overridden metod public class CD {... public void print() { super.print(); System.out.println(" " + artist); System.out.println(" tracks: " + numberOfTracks); }... }
Klassen Object:s metoder Metoder i Object ärvs av alla klasser Alla dessa kan ersättas (override) i de egna klasserna Metoden toString ersätts ofta: –public String toString() –Returnerar en sträng som representerar objektet
Overriding toString public class Item {... public String toString() { String line1 = title + " (" + playingTime + " mins)"); if(gotIt) { return line1 + "*\n" + " " + comment + "\n"); } else { return line1 + "\n" + " " + comment + "\n"); }... }
Overriding toString Det är generellt bättre att använda metoden toString istället för att göra en egen metod print : –System.out.println(item.toString()); Anrop till println med ett objekt som argument resulterar i att objektets metod toString automatiskt anropas: –System.out.println(item);
Protected synlighet Att använda synligheten Private i överklassen kan ibland vara allt för restriktivt för underklassen En närmare arvsrelation kan uppnås genom att använda synligheten protected Protected är mer restriktiv än public och variablerna är inte åtkomliga utifrån Man ska använda så restriktiv synlighet som möjligt
Synlighet
Summering Statisk och dynamisk typ Åsidosättande – overriding Åsidosätta toString() -metoden protected