Föreläsning 16 Arv Grundkurs i programmering Jan Lönnberg Institutionen för datateknik -universitetets högskola för teknikvetenskaper 3.11.2011
Varför? I ett studieregister har vi både studenter och lärare. Både studenter och lärare har namn och dylikt. Vi måste ändå ha samma get_name- och set_name-metoder... eller? Det här gör koden svårare att läsa och ändra på. Hur blir vi av med duplikaten? Föreläsning 16 Arv 2/15
Vad? Arv (eng. inheritance) är ett annat sätt att definiera begrepp som är delar av andra begrepp. I arv säger vi att en klass (subklassen) innehåller alla metoder och instansvariabler från en annan klass (superklassen). Objekt som är instanser av en klass är också instanser av dess superklasser. Föreläsning 16 Arv 3/15
Arvshierarki Djur Leddjur Ryggradsdjur Spindel Insekt Kräldjur Däggdjur Fågel Nyckelpiga Katt Människa Arvsrelationen bildar en hierarki. Föreläsning 16 Arv 4/15
object Många klassers definition börjar med (object). Inom parentesen anges den omedelbara superklassen; den som klassen tar sina metoder och variabler från. object är alla klassers superklass. Alla klasser ärver objects metoder och variabler (direkt eller indirekt). Alla objekt är instanser av object. Föreläsning 16 Arv 5/15
Experiment Undersök med type() och isinstance()-funktionerna vad olika inbyggda objekt och biblioteksobjekt är instanser av! type tar ett argument och returnerar dess typ. isinstance tar två argument och returnerar om det första är en instans av det andra. Använd Pydevs Hierarchy View för att undersöka klasshierarkin (tryck F4 över en klass) på t.ex. klasserna i Tkinter och tidigare exempel. Föreläsning 16 Arv 6/15
Exempel Låt oss skapa en klass Person som Student och Staff ärver från. Student-objekt är instanser av både Student och typ Person. Likaledes för Staff. Vi kan alltså använda Student och Staff som Person. Föreläsning 16 Arv 7/15
register Skapa en superklass Person med det som är gemensamt för Student och Staff. Ta bort allt onödigt från Student och Staff. Undersök med Hierarchy View vad ni skapat! Föreläsning 16 Arv 8/15
Överlagring En klass kan ersätta en ärvd metod med en annan. Detta kallas överlagring. Metoder söks alltså i en klass från objektets typ uppåt längs superklasserna till object. T.ex. str ()- och init ()-metoderna överlagras ofta. Subklassen kan initiera superklassens instansvariabler själv, men det bryter mot vår inkapslingsprincip. klass. init (self, argument ) lättaste sättet. Föreläsning 16 Arv 9/15
Överlagring Alternativt kan en överlagrad metod kommas åt genom super()-funktionen. Första argumentet är klassen att hoppa över i sökningen av metoden (typiskt klassen super() används i). Andra argumentet är (typiskt) ett objekt, vanligen self. Returvärdet är ett objekt från vilket metodanrop går till det givna objektet, men den angivna klassen hoppas över. Föreläsning 16 Arv 10/15
register Använd överlagring av init () för att initiera namnet på personer på bara ett ställe. Använd båda sätten att anropa superklassens initieringsmetod. Föreläsning 16 Arv 11/15
Multipelt arv En klass i Python kan ärva från flera klasser på en gång. Istället för en superklass kan man skriva en lista. Om vi har en häst- och en fågelklass, kan vi ha en pegas som ärver bådas förmågor. I initieringsmetoden måste vi anropa båda superklassernas initeringsmetoder (om de har) för att få instansvariabler initierade. Föreläsning 16 Arv 12/15
Multipelt arv Metoder som inte finns i en klass söks i superklasser i den ordningen som de anges i klassdefinitionens början (från vänster till höger). Sökningen sker rekursivt i den här ordningen. M.a.o. alla den vänstra superklassens superklasser kommer att kollas före den högra superklassen kollas. Föreläsning 16 Arv 13/15
horses Undersök Pegasus-klassen. Fyll i initieringsmetodens innehåll. För att bli av med de kvittrande pegaserna, döper vi om Horse.whinny() och Bird.chirp() till sound(). Se till att pegasen ärver rätt läte! Alternativt, överlagra sound() med ett unikt läte. Föreläsning 16 Arv 14/15
Slut Nästa föreläsning 10.11.2011 14:15 16:00 i Maari-C Tabeller Kom ihåg Rond 7 deadline 8.11. Rond 8 deadline 15.11. Föreläsning 16 Arv 15/15