Föreläsning 3 Arv
Kategorisering Stora program leder till många klasser (tänk liknelsen med en affär med många varor). Att dela in saker i kategorier är en vanlig strategi för att hantera stora komplexa problem. Exempel: - Varor i affär (mejerivaror, frukt/grönt, frysta varor, mjöl, etc.) - Djurriket (däggdjur, fåglar, kräldjur, etc.) - Katalogsystemet på datorn I objektorienterad programmering använder man arv för att kategorisera klasser. 2
Arvshierarki Animal Reptile Mammal Bird Iguana Monkey Penguin Figur 3.1 (s. 101) Swan - UML-notation, träddiagram - arv är en relation mellan två klasser där subklassen ärver alla egenskaper och förmågor av superklassen (och dess superklasser) - arv sparar arbete (jmf. s. 102) - arv är en är -relation (fågel är ett djur) - superclass (parent class, base class, överklass) - subclass (child class, derived class, underklass) - subklassen utvidgar (extends) och specialiserar superklassen - varje klass i Java har exakt en superklass (utom Object); Crow en klass kan ha godtyckligt många subklasser (single inheritance) 3
Java-syntax (arv) Exempel: public class Crow extends Bird {... Bird Crow Jämför med Lab 1: public class FirstApp extends Frame {... Utan extends ingen superklass? Alla Java-klasser utom en har exakt en superklass (se Figur 3.2). Exempel: public class Snowman {... Default: extends Object Object Snowman Frame FirstApp 4
UML-diagram Tre fält (namn, egenskaper, förmågor) + (public), - (private), # (protected) Varje klass har sin konstruktor Namn och metoder i kursiv stil markerar att de är abstrakta Metoder (se figur 3.3, s. 105): - Animal: move, gohome - Bird: move, gohome (ärvda från Animal), move (upprepad), fly - Penguin: move, gohome (ärvda från Animal), move, fly (ärvda från Bird), move, fly (upprepade) - Swan: move, gohome (ärvda från Animal), move, fly (ärvda från Bird), fly (upprepad) - Crow: move, gohome (ärvda från Animal), move, fly (ärvda från Bird) 5
Metoder ärvs Metoder som finns i superklassen kan användas på vanligt sätt. Klassen Crow har exempelvis inga egna metoder men den kan använda sina superklassers metoder: Home home = new Home(); Crow crow = new Crow(home); Location location = new Location(); crow.fly(location); //arv från Bird crow.gohome(); //arv från Animal 6
Metoder kan omdefinieras Metoder som finns i superklasserna kan omdefinieras (override) i subklassen. Klassen Penguin exempelvis ärver metoderna move och fly från klassen Bird men omdefinierar dessa. public class Penguin extends Bird {... public void move(location location) { this.swim(location); public void fly(location location) { public void swim(location location) {... 7
Metoder kan delvis omdefinieras Metoder som finns i superklasserna kan delvis omdefinieras i subklassen. Klassen Swan exempelvis ärver metoden fly från klassen Bird men omdefinierar den delvis. public class Swan extends Bird {... public void fly(location location) { _legs.run(location); super.fly(location); 8
Metodbestämning Metodbestämning (method resolution) är en teknik för att bestämma vilken metod ett namn refererar till. Exempelvis finns metoden fly i flera klasser. Om vi har en Penguin-instans penguin och en Crow-instans crow vilka fly-metoder används då i följande exempel: penguin.fly(location); crow.fly(location); Vad händer i följande exempel: crow.gohome(); 9
Abstrakta metoder Abstrakta metoder används då man vill att alla subklasser till en given klass ska definiera samma metod och då det inte finns någon standardimplementation. Exempel: public abstract class Animal {... public abstract void move(location location);... Home home = new Home(); Animal animal = new Animal(home); En klass kan göras abstrakt även då den inte innehåller abstrakta metoder. 10
Egenskaper En subklass ärver inte bara superklassens metoder utan även dess egenskaper (inklusive de privata). Superklassens egenskaper initialiseras genom att det första subklassens konstruktur gör är att anropa superklassens konstruktor. Exempel: public class FirstApp extends Frame {... public FirstApp() { super();... Superklassers konstruktorer anropas i flera steg: Crow -> Bird -> Animal -> Object 11
Tillgång till egenskaper Om alla klasser ska ha tillgång till en viss egenskap gör den private och gör metoder (set, get) för att komma åt den. Om endast subklasser ska ha tillgång till en viss egenskap gör den protected. Exempel: protected Wings _wings; 12
En klass har direktåtkomst av: sina egna instansvariabler sina egna metoder superklassers instansvariabler (protected eller public) superklassers metoder (protected eller public) alla andra klassers metoder (public) (alla andra klassers instansvariabler (public), sällsynta men kan förekomma) 13
Syftet med laboration 2 är att: ge fortsatt övning i komposition, ge övning i att använda arv, ge övning i att göra gränssnitt och klasser som implementerar gränssnitt, illustrera polymorfism, dvs hur man definierar instansvariabler som fungerar polymorfiskt, samt ge övning i att skriva interaktiva program (program som reagerar på musoperationer). 14