Emeoversikt subklasser INF1010 våre 2005 Uke 3, 25. jauar Arv og subklasser del I Stei Gjessig Istitutt for iformatikk 1 Geeraliserig - spesialiserig Gjebruk av klasser Ved sammesetig (komposisjo) Ved arv Referaser Klasse-hierarkier Virtuelle metoder Nøkkelordet super Koverterig av referaser Klasse Object Metodee equals() og tostrig() Nøkkelordet istaceof Kostruktører 2 Eksempel: Uiversitetsregister I et mii-system for uiversitetet i Oslo skal alle studeter registreres med av og telefoummer (åtte siffer), samt hvilket studieprogram de er tatt opp til. Det skal være mulig for studeter å bytte program. Systemet skal også ieholde iformasjo om de asatte ved uiversitetet, emlig av, telefoummer, løstri og atall arbeidstimer per uke. Tekiskadmiistrativt asatte har e arbeidsuke på 37.5 timer, mes viteskapelig asatte har 40-timers arbeidsuke. Klasse Studet class Studet { Strig av; it tlfr; Strig program; System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); System.out.pritl("Studieprogram: " + program); boolea gyldigtlfr() { retur tlfr >= 10000000 && tlfr <= 99999999; void byttprogram(strig ytt) { program = ytt; 3 4
Klasse Asatt Studet vs Asatt class Asatt { Strig av; it tlfr; it løstri; it atalltimer; System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); System.out.pritl("Løstri: " + løstri); System.out.pritl("Timer: " + atalltimer); boolea gyldigtlfr() { retur tlfr >= 10000000 && tlfr <= 99999999; void løtillegg(it tillegg) { løstri += tillegg; 5 Felles variable: av, tlfr Ege variable: Studet: program Asatt: løstri, atalltimer Felles metoder: gyldigtlfr() Ligede metoder: skrivdata() Ege metoder: Studet: yttprogram(strig ytt) Asatt: løstillegg(it tillegg) 6 Klasse Perso Studet og Asatt som subklasser Ka samle det som er felles i e ege, mer geerell, klasse: class Perso { Strig av; it tlfr; boolea gyldigtlfr() { retur tlfr >= 10000000 && tlfr <= 99999999; Ka å gjøre Studet og Asatt til subklasser av Perso: class Studet exteds Perso { Strig program; void byttprogram(strig ytt) { program = ytt; class Asatt exteds Perso { it løstri; it atalltimer; Agir at klassee Studet og Asatt er subklasser (= utvidelser) av klasse Perso. void løstillegg(it tillegg) { løstri += tillegg; 7 Hva med skrivdata()? - Kommer tilbake til dee 8
Bruk av e subklasse UML-otasjo for subklassehierarki Vi ka bruke variable og metoder i e subklasse på samme måte som om vi hadde defiert alt i e klasse: Ute bruk av subklasser: class Studet { Strig av; it tlfr; Strig program; boolea gyldigtlfr() {... void byttprogram(strig ytt) {... Med bruk av subklasser: Studet stud = ew Studet(); stud.gyldigtlfr(); Strig prog = stud.program; class Perso { Strig av; it tlfr; boolea gyldigtlfr() {... class Studet exteds Perso { Strig program; void byttprogram(strig ytt) {... class Perso { Strig av; it tlfr; boolea gyldigtlfr() {... class Studet exteds Perso { Strig program; void byttprogram(strig ytt) {... class Asatt exteds Perso { it løstri; void løstillegg (it tillegg){ løstri += tillegg; Perso Studet Asatt 9 10 class Studet { Strig av; it tlfr; Strig program; boolea gyldigtlfr() {... void byttprogram(strig ytt) {... Eksempler på objekter av klassee class Perso { Strig av; it tlfr; boolea gyldigtlfr() {... class Studet exteds Perso { Strig program; void byttprogram(strig ytt) {... av tlfr gyldigtlfr() Hva er e subklasse? E subklasse er e klasse som bygger på e allerede spesifisert klasse, og som dermed arver dees egeskaper i tillegg til å utvide med ege egeskaper (metoder/variable). E subklasse er altså e mer spesialisert utgave av klasse de bygger på. Klasse vi bygger på kalles da e superklasse. av tlfr program gyldigtlfr() byttprogram() av tlfr gyldigtlfr() program byttprogram() 11 12
Geeraliserig spesialiserig Klasser - Subklasser Nav Tlfr Klassehierarki: Bil class Bil {... Nav Tlfr Løstri AtallTimer Perso Asatt Studet Nav Tlfr Program Lastebil Persobil Drosje class Persobil exteds Bil {... class Lastebil exteds Bil {... class Drosje exteds Persobil {... 13 14 Klassehierarki: Alle lastebiler Persobil Lastebil Bil Klasser - Subklasser Drosje class Bil { <grøe egeskaper> class Persobil exteds Bil { <røde egeskaper> class Lastebil exteds Bil { < blå egeskaper> class Drosje exteds Persobil { < gule egeskaper> Alle biler Alle drosjer Alle persobiler Gjebruk av klasser Ved sammesetig (komposisjo): Deklarer referasevariable (pekere) til klasse Lag objekter av klasse Kall på metoder i klasse Ved arv : Lag e y klasse som utvider de eksisterede klasse Føy til ekstra variable og metoder 15 16
Gjebruk ved sammesetig Gjebruk ved arv Gjebruk ved sammesetig har dere allerede sett mage eksempler på i INF1000. Eksempel: class PersoRegister { HashMap medlemmer = ew HashMap(); Perso p = ew Perso(); Strig av = "Aud-Georg"; medlemmer, p og av er /* Diverse metoder */ deklarert som pekere til objekter av adre klasser som allerede eksisterer. :PersoRegister medlemmer p av="aud-georg" :Perso class Bok { Strig tittel, forfatter; class Fagbok exteds Bok { double dewey; class Skjølitterærbok exteds Bok { Strig sjager; class Bibliotek { Bok b1 = ew Fagbok(); Bok b2 = ew Skjølitterærbok(); :Bibliotek b1 b2 :Fagbok tittel=... forfatter=... dewey=... :Skjølitterærbok tittel=... forfatter=... sjager=... 17 18 Når skal vi bruke arv? Oppgave Geerelt: Ved er-e relasjo mellom objektee. E Studet er e Perso E Asatt er e Perso Hva med relasjoee roma bok? E roma er e bok (arv). kapittel bok? Et kapittel er ikke e bok, me e bok har/består av kapitler. Relasjoer som har-e og består-av skal ikke modelleres som subklasser, me ved hjelp av sammesetig (som datafelt (attributter/variable)). Hvor er det aturlig å bruke komposisjo og hvor er det aturlig med arv i disse tilfellee? Relasjo mellom Komposisjo Arv vare - varelager yhetskaal - kaal perso - persoregister cd - spor (sager) PC - datamaski gaupe - rovdyr fly - trasportmiddel motor - bil 19 20
Ulike måter å se et objekt på Type (klasse) til et objekt er uforaderlig. Et objekt ka likevel fremtre for oss på ulike måter. Et objekt av klasse class Studet exteds Perso {... ka vi se på som et objekt av type (klasse) Perso: da er egeskapee som er spesielle for Studet ikke sylige (me de er der fortsatt!). Studet: da er både Perso- og Studetegeskapee sylige for oss. Det er referases type som avgjør hvorda objektet fremtrer. (med utak av virtuelle metoder, sart skal vi lære hav dette er) 21 Ulike referasetyper Objekter av class Studet { Vi ka ha e referase av type Studet (s) Studet s; Perso p; s s p gyldigtlfr() av =... tlfr =... byttprogram() program =... Objekter av class Studet exteds Perso { gyldigtlfr() av =... tlfr =... byttprogram() program =... Vi ka ha e referase av type Studet (s) eller type Perso (p) 22 Eksempel Klasse-hierarkier class Perso { Strig av; it tlfr; boolea gyldigtlfr() {... class Studet exteds Perso { Strig program; void byttprogram(strig ytt) {... s Strig av; it tlfr: gyldigtlfr() program =... byttprogram() p Strig av; it tlfr: gyldigtlfr() program =... byttprogram() Ata: Studet s = ew Studet(); Perso p = ew Studet(); Hvilke av følgede uttrykk er å lovlige? s.av = "Aud-Georg"; s.gyldigtlfr(); s.program = "Matte"; s.byttprogram("data"); p.av = "Aud-Georg"; p.gyldigtlfr(); p.program = "Matte"; p.byttprogram("data"); 23 Det er mulig å defiere subklasser av e subklasse: class Perso { Strig av; it tlfr; class Studet exteds Perso { Strig program; class MasterStudet exteds Studet { Strig veileder; Obs: Her er MasterStudet e subklasse av både Studet og Perso, og arver egeskaper fra begge disse. Perso Studet MasterStudet 24
Omdefierig av metoder Omdefierig: eksempel Vi har sett at det med subklasser er mulig å utvide e eksisterede klasse med ye metoder. E subklasse ka også defiere e metode med samme sigatur som e metode i superklasse, me med ulikt ihold. De ye metode vil omdefiere (erstatte) metode som er defiert i superklasse. Metoder som ka omdefieres på dee måte kalles virtuelle metoder. I Java er alle metoder virtuelle, så sat de ikke er deklarert med fial. Kalles også polymorfi 25 class Hud { //... System.out.pritl("Voff-voff"); class Rasehud exteds Hud { //... System.out.pritl("Vov-vov"); Ata: Hud h = ew Hud(); Rasehud r = ew Rasehud(); Hud g = ew Rasehud(); For objekter av type Hud er det dee metode som gjelder. For objekter av type Rasehud er det dee metode som gjelder. Hva skrives ut ved hvert av kallee: h.bjeff(); r.bjeff(); g.bjeff(); 26 Omdefierig: eksempel Omdefierig: skrivdata Hud h Rasehud r Hud g I uiversitets-eksempelet så vi at klassee Studet og Asatt hadde este like skrivdata-metoder: Ata: System.out.pritl("Voff-voff"); Hud h = ew Hud(); Rasehud r = ew Rasehud(); Hud g = ew Rasehud(); System.out.pritl("Voff-voff"); System.out.pritl("Vov-vov"); Hva skrives ut ved hvert av kallee: h.bjeff(); r.bjeff(); g.bjeff(); voff-voff vov-vov vov-vov // I klasse Studet: System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); System.out.pritl("Studieprogram: " + program); // I klasse Asatt: System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); System.out.pritl("Løstri: " + løstri); System.out.pritl("Timer: " + atalltimer); 27 28
Nøkkelordet super Nøkkelordet super brukes for å aksessere variable/ metoder i objektets superklasse. Dette ka vi bruke til å la superklasse Perso ha e geerell skrivdata, som så kalles i subklassee: // I klasse Perso: System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); class StudetRegister { public static void mai(strig [] args) { Studet stud = ew Studet(); Perso pers = ew Perso(); Perso pers stud.skrivdata(); // Her brukes defiisjoe i Studet pers.skrivdata(); // Her brukes defiisjoe i Perso Perso pers2 = stud; pers2.skrivdata(); // Hvilke defiisjo beyttes her? Studet stud Peso pers2 // I klasse Studet: super.skrivdata(); System.out.pritl("Studieprogram: " + program); // Tilsvarede i klasse Asatt... 29 System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); Regel: Det er objekttype, ikke referasetype, som avgjør hvilke defiisjo som gjelder år e metode er omdefiert. System.out.pritl("Nav: " + av); System.out.pritl("Telefo: " + tlfr); super.skrivdata(); System.out.pritl("Studprgm: " + prgm); 30 Eksempel: Musikk.java Musikk.java versjo 2 Hva skrives ut år programmet Musikk.java kjøres? class Musikk { public static void mai (Strig[] args) { Istrumet ist = ew Piao(); ist.skrivdefiisjo(); class Istrumet { void skrivdefiisjo () { System.out.pritl("Et istrumet er oe ma ka spille på"); class Musikk { public static void mai (Strig[] args) { Istrumet ist = ew Piao(); ist.skrivdefiisjo(); Hva skjer i dette tilfellet? class Istrumet { void skrivdefiisjo(strig overskrift) { System.out.pritl(overskrift); System.out.pritl("Et istrumet er oe ma ka spille på"); class Piao exteds Istrumet { void skrivdefiisjo () { System.out.pritl("Et piao er et stregeistrumet"); class Piao exteds Istrumet { void skrivdefiisjo () { System.out.pritl("Et piao er et stregeistrumet"); 31 32
Musikk.java: Lærdom Metode som kaller virtuell metode Når vi ser på et objekt via e superklasse-peker, mister vi tilgag til metoder og variable som er defiert i subklasse. Dersom e metode eller variabel i subklasse også er defiert (med samme sigatur) i superklasse har vi likevel tilgag, fordi defiisjoe i superklasse "overkjøres". Det som er relevat er derfor hvilke metoder (og variable) som fies i superklasse, me ikke ødvedigvis iholdet i metode. class Vare { it pris; it prisutemoms() { retur pris; it prismedmoms() { retur (it) (1.25*prisUteMoms()); class SalgsVare exteds Vare { it rabatt; // I proset... it prisutemoms() { retur pris (pris*rabatt/100); Ata: Vare v = ew Vare(); v.pris = 100; SalgsVare s = ew SalgsVare(); s.pris = 100; s.rabatt = 25; Hva blir å: v.prismedmoms() s.prismedmoms() 33 34 pris 100 Omdefierig av variable Ata: Vare v = ew Vare(); v.pris = 100; SalgsVare s = ew SalgsVare(); s.pris = 100; s.rabatt = 20; SalgsVare s Hva blir å: v.prismedmoms() s.prismedmoms() Vare v it prisutemoms ( ) { retur pris; it prismedmoms { retur (it) (1.25*prisUteMoms ( ) ); pris it prisutemoms ( ) { retur pris; it prismedmoms { retur (it) (1.25*prisUteMoms ( ) ); rabatt 100 20 E subklasse ka også omdefiere (skyggelegge) variable som er defiert i superklasse. MEN: Dette bør IKKE brukes!!! Sjelde ødvedig Reduserer lesbarhete Ka føre til uvetet oppførsel Og mer treger dere ikke å vite om det it prisutemoms ( ) { retur pris (pris*rabatt/100); 35 36