INF1010 våren 2005 Uke 4, 1. februar Arv og subklasser, del 2

Like dokumenter
IN1010 våren 2019 Onsdag 6. februar. Arv og subklasser - del 2

INF1010 våren 2017 Torsdag 26. januar. Arv og subklasser del 1. Stein Gjessing Institutt for informatikk Universitetet i Oslo

INF1010 våren 2007 Uke 6, 6. februar Arv og subklasser, del 2

INF1010 våren februar. Arv og subklasser, del 2

INF1010 våren februar. Arv og subklasser, del 2. Repetisjon. Repetisjon - Biler. Repetisjon: Klasser - Subklasser

INF1010 våren Arv og subklasser, del 2

INF1010 våren 2005 Uke 3, 25. januar Arv og subklasser del I

INF1010 våren 2008 Uke 5, 29. januar Arv og subklasser eksempler Litt om unntakshåndtering (40 og 41) Stein Gjessing Institutt for informatikk

INF1010 våren 2008 Uke 5, 29. januar Arv og subklasser eksempler Litt om unntakshåndtering (40 og 41)

IN1010 våren 2019 Onsdag 15. mai. Rask repetisjon av subklasser og tråder (pluss µ nytt)

INF1010 våren Arv og subklasser, del 2

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

n / ($$ n 0$$/ $ " 1! <! ')! $ : ; $.+ $.5.+ .!)/!/ ) $.) 6$ 7$, $.5., $ 7$,

Objektorientert design av kode. Refaktorering.

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

INF1010 våren 2017 Torsdag 9. februar. Interface - Grensesnitt

IN1010 våren 2018 Tirsdag 13. februar. Interface - Grensesnitt

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser - del 2

INF våren januar, uke 3 - Oversikt og forutsetninger Java datastruktur-tegninger

INF1010 våren 2017 Torsdag 2. februar. Arv og subklasser - del 2

INF1010 våren Arv, subklasser og grensesnitt - del 2

INF1010 våren Arv og subklasser - del 2

INF våren 2005 Uke 1, 11 jan - Praktisk, oversikt og forutsetninger

IN1010 våren 2018 Tirsdag 6. februar. Arv og subklasser - del 2

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det, to typer av vinduer? GUI (Graphical User Interface)-programmering

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

INF1010 våren Arv og subklasser del 1

INF1010 våren Arv og subklasser del 1

Post-it spørsmål fra timen (Arv og subklasser)

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Hvordan gjør vi det, to typer av vinduer? Om Grafiske Bruker-Grensesnitt (GUI) GUI (Graphical User Interface)-programmering

INF1010 Arv. Marit Nybakken 2. februar 2004

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010, 23. februar Parametriserte klasser Om å gå gjennom egne beholdere (subklasser og grensesnitt 3)

Tråder i Java Parallelle programmmer og programbiter

INF3030 Uke 6, våren Eric Jul PSE Inst. for informatikk

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. Inf GUI - del 2

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000 HashMap. Marit Nybakken 2. november 2003

INF1000: Forelesning 7

INF1000: Forelesning 7. Konstruktører Static

INF2440 Uke 5, våren2018. Eric Jul PSE Inst. for informatikk

INF2440, Uke 3, våren 2018 Regler for parallelle programmer, mer om cache og Radix-algoritmen. Eric Jul PSE, Inst. for informatikk

Inf1000 (Uke 10) HashMap og ArrayList

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF Notater. Veronika Heimsbakk 10. juni 2012

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

INF1010 siste begreper før oblig 2

Gjennomgang av eksamen H99

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Seminaroppgaver til uke 3

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF3030 Uke 7, våren Eric Jul PSE Inst. for informatikk

Enkle generiske klasser i Java

Rekursjon. Binærsøk. Hanois tårn.

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

Løsningsforslag, inf101, våren 2001

UNIVERSITETET I OSLO

Stabler, Køer og Lister. ADT er

Seminaroppgaver IN1010, uke 2

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

IN3030 Uke 12, v2019. Eric Jul PSE, Inst. for informatikk

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

IN1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

INF våren 2004 Uke2, 18 jan - Fra problem til program. Utvikling av store datasystemer. 13 UML-diagrammer. Oversikt:

INF1000: noen avsluttende ord

INF Uke 10. Ukesoppgaver oktober 2012

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

b) 10 2 = 20 c) 5 1 = 5.

INF Innleveringsoppgave 6

INF1000 (Uke 6) Mer om metoder, tekster

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

Kapittel 9: Sortering og søking Kort versjon

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Feilmeldinger, brukerinput og kontrollflyt

Transkript:

INF1010 våre 2005 Uke 4, 1. februar Arv og subklasser, del 2 Stei Gjessig Istitutt for iformatikk Repetisjo Vi har sett to former for gjebruk av klasser: Ved sammesetig (komposisjo) Modellerer relasjoer som består av/har e Ved arv (bruk av subklasser) Modellerer relasjoer som er e/er et E subklasse deklareres ved bruk av økkelordet exteds: class B exteds A { deklarerer B som e subklasse (utvidelse) A. 1 2 Klassehierarki: Repetisjo - Biler Klassehierarki: Persobil Bil Repetisjo: Klasser - Subklasser class Bil { <lys beige egeskaper> class Persobil exteds Bil { <røde egeskaper> class Lastebil exteds Bil { < grøe egeskaper> class Drosje exteds Persobil { < gule egeskaper> Lastebil Bil Persobil class Bil {... class Persobil exteds Bil {... class Lastebil exteds Bil {... Alle lastebiler Drosje Alle biler Alle drosjer Alle persobiler Lastebil Drosje class Drosje exteds Persobil {... 3 4

Dyreriket (utdrag) Repetisjo - dyreriket Aimalia Leddyr Ryggstregdyr Bløtdyr Tusebei Isekter Kappedyr Virveldyr Blekksprut Segler Fugler Pattedyr Slager og øgler Rovdyr r; Hovdyr Klovdyr Rovdyr Hjort Kveg Kattedyr Hudedyr Storfe Geit Sau Rev Hud Ulv ew Geit(); Hetet fra http://www.miljolare.o/data/ut/art/ 5 Pattedyr Klovdyr Kveg Geit Sau Side Geit er et Kvegdyr, ka vi gjøre klasse Geit til e subklasse av klasse Kveg: class Geit exteds Kveg { Klasse Geit arver da alle egeskaper (variable/ metoder) til klasse Kveg, i tillegg til å ha sie ege egeskaper. Objekter av klasse Geit vil utgjøre e delmegde av objekter av klasse Kveg, de er spesialiserte. Side Geit er et Kveg, og Kveg er et Klovdyr, vil også Geit være et Klovdyr. Dermed arver Geit også alle egeskapee til klasse Klovdyr (via klasse Kveg). 6 Repetisjo - dyreriket Hva slags objekt har jeg? Pattedyr Kattedyr Rovdyr Hudedyr Rev Hud Ulv Side e Hud er et Rovdyr, ka vi bruke e Hud hver gag vi har behov for et Rovdyr. Altså ka e Rovdyr-peker også peke på objekter av klasse Hud: Rovdyr r = ew Hud(); Hva skjer å hvis vi prøver metodekallet r.m()? Ved kompilerig: Kallet r.m() godkjees dersom det fies e metode m() i klasse Rovdyr eller e superklasse til dee. Ved kjørig: Hvis det fies e metode m() i klasse Hud, er det dee som brukes. Hvis ikke, leter vi oppover i klasse-hierarkiet til vi fier de. 7 De boolske operatore istaceof hjelper oss å fie ut hvilke klasse et gitt objekt er basert på, oe som er yttig i mage tilfeller: class TestFrukt { public static void mai(strig[] args) { Eple e = ew Eple(); skrivut(e); Hva blir utskrifte til dette programmet? static void skrivut(frukt f) { if (f istaceof Eple) System.out.pritl("Dette er et eple!"); else if (f istaceof Appelsi) System.out.pritl("Dette er e appelsi!"); class Frukt {.. class Eple exteds Frukt {.. class Appelsi exteds Frukt {.. 8

Eksempel La oss utvide metode i skrivut til også å teste på frukt: Oppgave Hva skrives ut her? static void skrivut(frukt f) { if (f istaceof Frukt) System.out.pritl("Dette er e frukt!"); else if (f istaceof Eple) System.out.pritl("Dette er et eple!"); else if (f istaceof Appelsi) System.out.pritl("Dette er e appelsi!"); Hva vil resultatet av programmet bli hvis vi bruker dee versjoe av skrivut? Lærdom: Et objekt vil alltid være e istas av sie superklasser i tillegg til si ege klasse. 9 class Oppgave { public static void mai (Strig[] args) { A apeker = ew A(); B bpeker = ew B(); apeker.skriv(); bpeker.skriv(); apeker = bpeker; apeker.skriv(); if (apeker istaceof A) { System.out.pritl ("apeker istaceof A"); if (apeker istaceof B) { System.out.pritl ("apeker istaceof B"); class A { void skriv() { System.out.pritl(bereg()); it bereg() { retur 10; class B exteds A { void skriv() { System.out.pritl ("Svaret er: " + bereg()); 10 Mer bruk av istaceof Koverterig av referaser (pekere) class Bil { Strig regnr; class Persobil exteds Bil { it atpass; class Lastebil exteds Bil { double lastevekt; class Drosje exteds Persobil { it LøyveNr; Iterator it = allebiler.values().iterator(); while (it.hasnext()) { Bil b = (Bil) it.ext(); Strig r = b.regnr; if (b istaceof Pesobil) { Persobil pb = (Persobil) b; it pas = pb.atpass; else { if (b istaceof Lastebil) { Lastebil ls = (Lastebil) b; double lv = ls.lastevekt; 11 Ata at vi har: class Studet exteds Perso { Studet stud = ew Studet(); Ved tilordige Perso pers; pers = stud; har vi e implisitt koverterig fra Studet- til Persoreferase. Hvis vi å øsker å få tak i de spesielle Studetegeskapee, må vi foreta e eksplisitt koverterig tilbake til Studet igje: Studet stud2 = (Studet) pers; Dette kalles castig på egelsk 12

Koverterig av referaser (forts.) Koverterig mellom flere ivåer Hva hvis vi istedefor hadde hatt: Perso pers = ew Perso(); Studet stud = (Studet) pers; Dette godkjees av kompilatore, me ved kjørig får vi feilmeldige java.lag.classcastexceptio (fordi pers ikke peker på et objekt med alle Studet egeskapee) For å ugå dee feile, bruk istaceof: if (pers istaceof Studet) { Studet stud = (Studet) pers; (Har det objektet pers peker på alle Studet - egeskapee?) Perso Studet MasterStudet MasterStudet master = ew MasterStudet(); Koverterig oppover: Studet stud = master; Perso pers = master; Koverterig edover: Perso pers Studet stud (Studet) pers (MasterStudet) pers (fordi dette krever kotroll uder kjørig) MasterStudet master Alle pekere har lov til å peke bortover og edover (me ikke oppover ) 13 14 Oppgave Brev Koverterig til klasse Object Ata at vi har deklarasjoee Sokad class Brev { class Sokad exteds Brev { class Kjaerlighetsbrev exteds Brev { Avgjør hvilke av følgede uttrykk som er lovlige: Sokad s1 Sokad s2 = ew Sokad(); = ew Brev(); Brev b1 = ew Sokad(); Brev b2 = (Brev) ew Sokad(); Sokad s3 = ew Kjaerlighetsbrev(); Sokad s4 = (Sokad) ew Kjaerlighetsbrev(); Lovlig Kjaerli. Ulovlig Alle klasser i Java er subklasser av klasse Object. Når vi skriver class Perso { så tolker Java dette som class Perso exteds Object { Dermed ka vi alltid kovertere e referase oppover til klasse Object: Perso pers = ew Perso(); Object obj = pers; For å sakke om egeskapee til Perso-objektet må vi kovertere edover igje: (Perso) obj Brev b3 = (Sokad) ew Brev(); 15 16

Eksempel: HashMap ArrayList E og samme HashMap ka brukes til å lagre objekter av e hvilke som helst klasse "trikset" er å teke på dem alle som objekter av klasse Object. HashMap tabell = ew HashMap(); Studet stud = ew Studet(); stud.lesfratermial(); tabell.put("kari", stud); stud = (Studet) tabell.get("kari"); Disse blir implisitt kovertert oppover til Object, side metode put i HashMap har formalparametre put(object key, Object value). Dette gir e referase til et objekt av klasse Object, og vi må eksplisitt kovertere edover til Studet for å sakke om objektets Studet-egeskaper. 17 E ae yttig klasse i java.util, er ArrayList. I likhet med HashMap, fugerer ArrayList på objekter av type Object. E ArrayList fugerer mye på samme måte som e array, me ute fast størrelse. De viktigste metodee i ArrayList: add(object o): legger til objektet o sist i arraye add(it i, Object o): legger til objektet o på ideks i, ved å skyve de resterede elemetee edover size(): gir atall elemeter i arraye 18 ArrayList (forts.) Object: tostrig og equals get(it i): returer objektet på plass i remove(it i): fjerer (og returerer) objektet på plass i, ved å skyve resterede elemeter oppover På samme måte som for e HashMap, returerer get og remove bare e Object-referase. Dee må vi så valigvis kovertere edover til riktig type. Eksempel på bruk: ArrayList liste = ew ArrayList(); liste.add(ew Perso("Kari")); liste.add(ew Perso("Per")); liste.add(1, ew Perso("Ola")); Hva blir p2 her? Perso p = (Perso) liste.remove(0); liste.add(1, p); Perso p2 = (Perso) liste.get(liste.size()-1); Klasse Object ieholder bl.a. to viktige metoder: Strig tostrig(): returerer e Strig-represetasjo av objektet boolea equals(object o): sjekker om to objekter er like (i utgagspuktet det samme som pekerlikhet) Disse metodee ka ma så selv redefiere til å gjøre oe mer foruftig. Poeget er at e bruker av e klasse vet at disse metodee alltid vil være defiert. 19 20

Eksempel på tostrig og equals Kostruktører class Pukt { it x, y; Pukt(it x0, it y0) { x = x0; y = y0; Ata: Pukt p1 = ew Pukt(3,4); Pukt p2 = ew Pukt(3,4); Pukt2 q1 = ew Pukt2(3,4); Pukt2 q2 = ew Pukt2(3,4); Hva blir å: p1.tostrig(); p1.equals(p2); class Pukt2 { it x, y; Pukt2(it x0, it y0) { x = x0; y = y0; public Strig tostrig() { retur ("x = "+x+" y = "+y); public boolea equals(object o) { if (!(o istaceof Pukt2)) retur false; Pukt2 p = (Pukt2) o; retur x == p.x && y == p.y; Pukt@f5da06 q1.tostrig(); x = 3 y = 4 false q1.equals(q2); true 21 Bruk av kostruktører år vi opererer med "ekle" klasser er gaske ukomplisert. Når vi skriver Pukt p = ew Pukt(3,4); class Pukt { skjer følgede: it x, y; 1. Det settes av plass i iter-miet til et objekt av klasse Pukt og til referase p. 2. Variablee x og y blir deklarert. 3. Kostruktør-metode blir kalt med x0=3 og y0=4. 4. Etter at kostruktøre har satt x=3 og y=4, settes høyreside i tilordige Pukt p = ew Pukt(3,4) lik adresse (referase) til det ye objektet. 5. Tilordige Pukt p = utføres, dvs p settes lik adresse til objektet. av: p type: Pukt Pukt(it x0, it y0) { x = x0; y = y0; av: x av: y 3 4 type: it type: it Pukt(it x0, it y0) av: x0 3 type: it x = x0; y = y0; av: y0 4 type: it 22 Kostruktører og arv Kostruktører og arv (forts.) Det blir oe mer komplisert år vi opererer med arv: Ata at vi har defiert e subklasse class B exteds A { Hvilke kostruktør utføres hvis vi skriver B bpeker = ew B(); Kostruktøre i klasse A? Kostruktøre i klasse B? Begge? Ata at vi har deklarert tre klasser: class A { class B exteds A { class C exteds B { Når vi skriver ew C() skjer følgede: 1. Kostruktøre til C kalles (som valig) 2. Kostruktøre til C starter med å kalle på B si kostruktør 3. Kostruktøre til B starter med å kalle på A si kostruktør 4. Så utføres A si kostruktør 5. Kotrolle kommer tilbake til B si kostruktør, som utføres 6. Kotrolle kommer tilbake til C si kostruktør, som utføres 23 24

Kall på super-kostruktøre Eksempel 1 Superklasses kostruktør ka kalles fra e subklasse ved å si: - vil kalle på e kostruktør ute parametre super(5, test ); - om vi vil kalle på e kostruktør med to parametre (it og Strig) Et kall på super må legges helt i begyelse av kostruktøre. Kaller ma ikke super eksplisitt, vil Java selv legge i kall på super( ) år programmet kompileres. Lager du e kostruktør med parametre, vil Java ikke legge i i klasse de tomme kostruktøre ute parametre. Det må du evetuelt gjøre selv! 25 Ata at vi har følgede klasser: class Perso { Strig fødselsr; Perso() { fødselsr = ""; class Studet exteds Perso { it studid; Studet() {... Her er to kostruktører: Studet() { studid = 0; Studet() { studid = 0; Disse to er helt ekvivalete! Hva skjer hvis Studet ikke har oe kostruktør :? class Studet exteds Perso { it studid = 0; 26 Eksempel 2 Eksempel 3 Ata at vi har følgede klasser: class Perso { Strig fødselsr; Perso(Strig fr) { fødselsr = fr; class Studet exteds Perso { it studid; Studet() {... Her er to forslag til kostruktører: Studet() { super(""); studid = 0; Studet() { studid = 0; Disse er ikke ekvivalete. (Bare de ee virker - hvilke?) 27 class Bygig { Bygig() { System.out.pritl("Bygig"); class Bolighus exteds Bygig { Bolighus() { System.out.pritl("Bolighus"); class Blokk exteds Bolighus { Blokk() { System.out.pritl("Blokk"); public static void mai(strig[] args) { ew Blokk(); Hva blir utskrifte fra dette programmet? 28

Når programmet kompileres Når programmet utføres class Bygig { Bygig() { System.out.pritl("Bygig"); // class Bygig class Bolighus exteds Bygig { Bolighus() { System.out.pritl("Bolighus"); // class Bolighus Java føyer selv på super() i disse tre kostruktøree før programmet eksekveres 4. class Bygig { Bygig() { System.out.pritl("Bygig"); // class Bygig class Bolighus exteds Bygig { Bolighus() { System.out.pritl("Bolighus"); // class Bolighus 5. Til Object si kostruktør 3. class Blokk exteds Bolighus { Blokk() { System.out.pritl("Blokk"); public static void mai(strig[] args) { ew Blokk(); // class Blokk 29 2. class Blokk exteds Bolighus { Blokk() { System.out.pritl("Blokk"); public static void mai(strig[] args) { ew Blokk(); // class Blokk Her starter eksekverige 1. 30 Når programmet utføres (forts.) Eksempel 4 7. Nå er Bygig skrevet ut 8. Nå er Bolighus skrevet ut 9. Nå er Blokk skrevet ut class Bygig { Bygig() { System.out.pritl("Bygig"); // class Bygig class Bolighus exteds Bygig { Bolighus() { System.out.pritl("Bolighus"); // class Bolighus class Blokk exteds Bolighus { Blokk() { System.out.pritl("Blokk"); public static void mai(strig[] args) { ew Blokk(); // class Blokk 6. Tilbake fra Object si kostruktør 31 class Bygig { Bygig() { System.out.pritl("Bygig"); class Bolighus exteds Bygig { Bolighus(it i) { System.out.pritl("Bolighus r " + i); class Blokk exteds Bolighus { Blokk() { System.out.pritl("Blokk"); public static void mai(strig[] args) { ew Blokk(); Hva skjer i dette eksempelet? Merk: Kostruktøre i klasse Bolighus har å e parameter. 32

Når programmet kompileres Et større eksempel: Barehage class Bygig { Bygig() { System.out.pritl("Bygig"); // class Bygig class Bolighus exteds Bygig { Bolighus(it i) { System.out.pritl("Bolighus"); // class Bolighus class Blokk exteds Bolighus { Blokk() { System.out.pritl("Blokk"); public static void mai(strig[] args) { ew Blokk(); // class Blokk Java legger igje til kall på super() i alle kostruktøree. Me: Kallet matcher ikke metode i atall parametre! Mulige løsiger: 1. Selv legge til kall på super, med argumet, i kotruktøre Blokk. 2. Legge til e tom kostruktør i Bolighus. 33 Vi skal lage et program for å admiistrere e barehage. I barehage fies det to typer avdeliger: Småbarsavdelig Bar opp til 3 år Plass til 9 bar Avdelig for større bar Bar over 3 år Plass til 18 bar Et bar ka være tatt opp til maksimalt e avdelig. For hver avdelig vedlikeholdes e veteliste. Et bar ka bare stå på e veteliste. Derimot ka et bar både være tatt opp i e småbarsavdelig, og stå på veteliste til e avdelig for større bar. Opptak fra veteliste skjer "ved loddtrekig", me med søskeprioritet ved opptak til småbarsavdeligee. Til avdeligee for større bar har bar som allerede har plass i e småbarsavdelig prioritet. 34 Barehage: Klassediagram Barehage: Objekt-diagram "Per" :Bar Barehage 1 tattopp * 1 1..* Avdelig 1 * * Bar søske * veteliste :Barehage allebar alleavd "Marihøe" "Ugle" :SmåbarAvd av="marihøe" atallplasser=9 tattopp veteliste av="per" født=2002 søske "Per" :StorebarAvd SmåbarAvd StorebarAvd 35 av="ugle" atallplasser=18 tattopp veteliste 36

Klasse Avdelig med subklasser class Avdelig { Strig av; it atallplasser; HashMap tattopp; HashMap veteliste; Klassee Bar og Barehage class Bar { Strig av; it født; HashMap søske; Avdelig veter, opptak; class SmåbarAvd exteds Avdelig { SmåbarAvd(Strig av) { super(av); atallplasser = 9; Avdelig(Strig av) { this.av = av; tattopp = ew HashMap(); veteliste = ew HashMap(); Bar(Strig av) { this.av = av; søske = ew HashMap(); class StorebarAvd exteds Avdelig { StorebarAvd(Strig av) { public static void mai(strig[] args) { super(av); Barehage bhg = ew Barehage(); atallplasser = 18; bhg.ordreløkke(); 37 38 class Barehage { HashMap allebar = ew HashMap(); HashMap alleavd = ew HashMap(); I i = ew I(); Out ut = ew Out(); Barehage: oe metoder Metode yavdelig() Vi skal kosetrere oss om følgede metoder: Ny avdelig Ledige plasser: Skriver ut atall ledige småbarsplasser og atall ledige plasser for store bar totalt i barehage. Søkad: Setter et bar på veteliste til e avdelig. Opptak: Foretar opptak av bar til alle avdeligee i barehage. I tillegg fies selvfølgelig metoder for å registrere bar/søske, skrive iformasjo om bar/avdelig, Se kursets hjemmeside for "fullstedig" program. 39 // I klasse Barehage: void yavdelig() { Strig av; Avdelig a; System.out.prit("Nav på y avdelig: "); av = i.itext(); if (alleavd.cotaiskey(av)) { System.out.pritl("Registrert allerede"); retur; System.out.prit("Småbarsavdelig (j/)? "); if (i.ichar() == 'j') { a = ew SmåbarAvd(av); else { a = ew StorebarAvd(av); alleavd.put(av, a); 40

Metode ledigeplasser() // I klasse Barehage: void ledigeplasser() { it atallsmå = 0; it atallstore = 0; Iterator it = alleavd.values().iterator(); while (it.hasnext()) { Avdelig a = (Avdelig) it.ext(); if (a istaceof SmåbarAvd) atallsmå += a.atallledige(); else atallstore += a.atallledige(); System.out.pritl("Småbarsplasser: " + atallsmå); System.out.pritl("For store bar: " + atallstore); // I klasse Avdelig: Søkad om opptak // I klasse Barehage: void søkad() { Strig aav, bav; Avdelig a; Bar b; System.out.prit("Avdeliges av: "); aav = i.itext(); System.out.prit("Barets av: "); bav = i.itext(); a = (Avdelig) alleavd.get(aav); b = (Bar) allebar.get(bav); if (a == ull b == ull) { System.out.pritl("Fier ikke bar/avdelig"); retur; it atallledige() { retur atallplasser tattopp.size(); 41 a.søkad(b); 42 Søkad om opptak (klasse Avdelig) Søkad om opptak (klasse Bar) // I klasse SmåbarAvd: void søkad(bar b) { if (b.alder() < 3) { super.søkad(b); else { // I klasse Avdelig: void søkad(bar b) { veteliste.put(b.av, b); b.settveteliste(this); System.out.pritl("For stor"); // I klasse StorebarAvd: void søkad(bar b) { if (b.alder() >= 3) { super.søkad(b); else { System.out.pritl("For lite"); 43 // I klasse Bar: it alder() { it iår = Caledar.getIstace().get(Caledar.YEAR); retur iår - født; void settveteliste(avdelig a) { if (veter!= ull) { veter.fjerfraveteliste(this); veter = a; // I klasse Avdelig: void fjerfraveteliste(bar b) { veteliste.remove(b.av); 44

Opptak Opptak (klasse Avdelig) // I klasse Barehage: void opptak() { Iterator it = alleavd.values().iterator(); while (it.hasnext()) { Avdelig a = (Avdelig) it.ext(); a.opptak(); // I klasse Avdelig: void opptak() { ArrayList søkader = ew ArrayList(); Iterator it = veteliste.values().iterator(); while (it.hasnext()) { Bar b = (Bar) it.ext(); if (prioritert(b)) { søkader.add(0,b); // Legg til først else { søkader.add(b); // Legg til sist 45 // Søkadsliste er å sortert slik at bar med prioritet // ligger først i arraye. while (atallledige() > 0 && søkader.size() > 0) { Bar b = (Bar) søkader.remove(0); taopp(b); 46 Opptak (klasse Avdelig forts.) Opptak (klasse Bar) // I klasse Avdelig: // I klasse SmåbarAvd: // I klasse Bar: boolea prioritert(bar b) { retur false; boolea prioritert(bar b) { retur b.søskemedplass(); boolea harplass() { retur opptak!= ull; void taopp(bar b) { tattopp.put(b.av, b); fjerfraveteliste(b); b.tattopp(this); // I klasse Bar: void tattopp(avdelig a) { if (opptak!= ull) opptak.slutter(this); if (veter == a) veter = ull; opptak = a; // I klasse StorebarAvd: boolea prioritert(bar b) { retur b.harplass(); // I klasse Avdelig: void slutter(bar b) { tattopp.remove(b.av); 47 boolea søskemedplass() { boolea plass = false; Iterator it = søske.values().iterator(); while (it.hasnext() &&!plass) { Bar b = (Bar) it.ext(); if (b.harplass()) { plass = true; retur plass; 48