• No results found

Flerfamiljshus.java (forts)

N/A
N/A
Protected

Academic year: 2021

Share "Flerfamiljshus.java (forts)"

Copied!
24
0
0

Loading.... (view fulltext now)

Full text

(1)

Distanskursen objektorienterad programmering med Java

Sven-Olof Nyström Uppsala Universitet

April 20, 2006

(2)

Tidigare exempel: en fordonshierarki

Fyra klasser:

Fordon (abstrakt)

Motorfordon (abstrakt) Bil

Cykel

Toppfarten för en cykel beräknas från cyklistens ålder.

Toppfarten för en bil beräknas från motorstykan.

(3)

Polymorfi

Ordet polymorfi betyder många former

i OO-sammanhang helt enkelt att objekt i en arvshierarki kan ha samma gränssnitt men att implementationen kan skilja sig.

Exempel på polymorfi:

Klassen GeometricShape med subklasser.

utan polymorfi vore begreppen interface och abstrakta klasser meningslösa...

(4)

Exempel: en hushierarki

• Vi har en klasshierarki med (bland annat) klasserna Hus, Bostadshus, Flerfamiljshus.

• Ett hus har diverse attribut, till exempel längd och bredd.

• Ett bostadshus är (förstås) ett slags hus. På samma sätt är ett flerfamiljshus ett slags bostadshus.

• Ett flerfamiljshus har ett attribut som anger antalet lägenheter.

(5)

public class Hus { double längd;

double bredd;

int antalVåningar;

int senasteRenovering; // årtal

public Hus( double längd, double bredd, int antalVåningar, int senasteRenovering ) {

this.längd = längd;

this.bredd = bredd;

this.antalVåningar = antalVåningar;

this.senasteRenovering = senasteRenovering;

}

public double yta() {

return längd * bredd * antalVåningar; }}

(6)

Filen Bostadshus.java

class Bostadshus extends Hus { boolean tilläggsisolerat = false;

public Bostadshus(double längd, double bredd, int antalVåningar, int senasteRenovering ) {

super(längd, bredd, antalVåningar, senasteRenovering);

}

public void isolera() { tilläggsisolerat = true;

} }

(7)

Flerfamiljshus.java

public class Flerfamiljshus extends Bostadshus { int antalLägenheter;

int senasteRenovering;

static double hyrePerM2 = 1000;

public Flerfamiljshus(double längd, double bredd, int antalVåningar,

int antalLägenheter,

int senasteYttreRenovering, int senasteInreRenovering ) {

super(längd,bredd,antalVåningar,senasteYttreRenovering);

this.antalLägenheter = antalLägenheter;

senasteRenovering=senasteInreRenovering;}

(8)

Flerfamiljshus.java (forts)

public int antalLgh() {

return antalLägenheter;

}

public double yta() {

return längd*bredd*antalVåningar*0.95;

} }

(9)

TestHus.java

public class TestHus {

public static void main( String[] args ) {

Bostadshus b = new Bostadshus( 15, 20, 3, 1945 );

Flerfamiljshus f=new Flerfamiljshus(15,20,3,4,1967,1989);

System.out.println( b.yta() );

System.out.println( f.yta() );

} }

Programmet skriver (som sig bör):

900.0 855.0

(10)

Dynamisk bindning public class TestHus1 {

public static void main( String[] args ) {

Bostadshus b = new Bostadshus( 15, 20, 3, 1945 );

Flerfamiljshus f=new Flerfamiljshus(15,20,3,4,1967,1989);

Hus h = new Flerfamiljshus(15,20,3,4,1967,1989);

System.out.println( b.yta() );

System.out.println( f.yta() );

System.out.println( h.yta() );

} }

(11)

Dynamisk bindning (forts)

Vi deklarerar en referens till Hus och låter denna referera ett Flerfamiljshus. Utskriften blir

900.0 855.0 855.0

Metoden yta() som definierats i klassen Flerfamiljshus används.

(12)

Dynamisk bindning

• När man använder överskuggade metoder är

objektets klass som avgör vilken metod som anropas.

Detta kallas också dynamisk bindning, vilken metod som skall anropas bestäms först när programmet körs.

• Man kan säga: Mottagaren vet hur meddelandet ska tolkas.

(13)

Tilldelningsregler och substituerbarhet

Om klassen B är en subklass till klassen A gäller:

Överallt där det krävs ett objekt av klassen A kan man ge ett objekt av klassen B.

Man kan t.ex. skriva en metod som jämför ytan av två hus (fungerar för alla typer av hus):

public boolean större( Hus h ) { return yta() > h.yta();

}

(14)

Substituerbarhet, exempel

• En klass Person med subklass ShopKeeper

• Klassen Person lagrar namn och adress etc

• Klassen ShopKeeper lagrar information om affären, etc

• Ett objekt av typen ShopKeeper kan lagras i en

datastruktur där objekt av typen Person väntas (till exempel, en telefonkatalog)

(15)

Substituerbarhet, exempel (forts)

• En metod som väntar sig ett objekt Person (som skriver ut namn och adress, till exempel), kan lika gärna ta ett objekt Shopkeeper

• Det finns inget sätt att skilja på ett objekt av typ Person och ett objekt ShopKeeper om du bara får

använda metoder definierade för klassen Person (ok, det finns, men vi ska inte använda det...)

(16)

Dolda instansvariabler

Reglerna för överskuggade instansvariabler och metoder skiljer sig åt. Exempel:

public class TestHus2 {

public static void main( String[] args ) {

Flerfamiljshus f=new Flerfamiljshus(15,20,3,4,1996,1994);

Hus h = f;

System.out.println(f.senasteRenovering);

System.out.println(h.senasteRenovering); }}

(17)

Dolda, exempel (forts) vi försöker använda den dolda instansvariabeln senasteRenovering. Programmet skriver 1994

1996

För variablen h som är av typen Hus betyder fältet

senasteRenovering alltid det som deklareras i Hus trots att h ju egentligen refererar ett flerfamiljshus.

Funnes inte senasteRenovering i Hus skulle vi få kompileringsfel.

(Som vi tidigare sett är det tvärtom objektets

klasstillhörighet som avgör vilken metod som ska anropas.)

(18)

Dolda instansvariabler (forts)

För att komma åt Hus variant av senasteRenovering i klassen Flerfamiljshus skriver vi

super.senasteRenovering.

Om variablen b är deklarerad och initialiserad enligt Flerfamiljshus b = new Flerfamiljshus(...)

Utanför klassen kan man skriva är man hänvisad till att deklarera referenser av superklassen.

Om b är av typ Flerfamiljshus och man vill komma åt den instansvariabel som deklarerades i klassen Hus:

((Hus) b).senasteRenovering

(19)

Dolda instansvariabler (forts) Man kan på samma sätt komma åt metoden yta i Hus genom att inne i

Flerfamijshus anropa super.yta(), d.v.s. metoden yta() i Flerfamijshus skulle kunna skrivas:

public double yta() {

return super.yta() * 0.95;

}

Återanvändning av kod är alltid (?) bra!

Både abstrakta klasser och gränssnitt (interface) är exempel på arv genom specifikation.

(20)

Polymorfi

Anta att vi har en array av hus.

Anta vidare att bostadshus (som inte är flerfamiljs-) alltid har en lägenhet och att hus som inte är bostadshus har ingen.

(21)

En husarray

public class HusArray {

public static void main( String[] args ) { Hus[] husen = new Hus[4];

husen[0] = new Bostadshus( 15, 20, 3, 1945 );

husen[1] =

new Flerfamiljshus( 15, 20, 3, 4, 1967, 1989);

husen[2] = new Hus( 15, 20, 3, 1967);

husen[3] =

new Flerfamiljshus( 100, 30, 10, 12, 1990, 1990);

...

(22)

Beräkna det totala antalet lägenheter

static int totaltAntalLägenheter(Hus[] husen) { int lgh = 0;

for (int i=0; i < husen.length; i++) {

if (husen[i] instanceof Flerfamiljshus) {

Flerfamiljshus h = (Flerfamiljshus) husen[i];

lgh += h.antalLgh();

}

else if (husen[i] instanceof Bostadshus) lgh++;

}

return lgh;

}

(23)

Alternativ lösning

...

int lgh = 0;

for (int i=0; i < 4; i++) {

lgh = lgh + husena[i].antalLgh();

}

System.out.println("Totalt antal lägenheter: " + lgh );

} }

Förutsätter att alla hus definierar metoden antalLgh.

(24)

Alternativ (forts)

Vi säger att objekt av klassen Hus har inga lägenheter.

public class Hus {

public int antalLgh() { return 0; } ... }

... men ett objekt av klassen BostadsHus har exakt en lägenhet.

class Bostadshus extends Hus { public int antalLgh() { return 1; } ... }

References

Related documents

• Man kan även låta destruktorn vara privat då förhindras allokering på

Området hyser ett visst biotopvärde, främst genom förekomst av grov ek och asp, samt ett visst artvärde vilket motiverar ett påtagligt

Objekt Vinařství v sobě spojuje několik funkcí - trvalé bydlení pro majitele a jeho sestru, výrobu vína, místo pro degustace a ubytování pro turisty.. Pro uspořádání

Om man specificerar detta objekt till aktiviteten att skriva ett brev står skrivpulpeten även i re- lation till Centralposthuset och föremål som associeras till denna byggnad..

• UML—ett språk för att beskriva resultat av analys

Att Stina Fors vid moderns död stod helt utan pengar är troligen också en sanning med modifikation eftersom hon av reportaget att döma bor kvar i det stora huset och dessutom

Ultimaker Cura är mjukvaran som samarbetar med 3D-skrivaren för att kunna skriva ut ett objekt som har ritats i CAD eller har skannats med 3D-skanner. I programmet

En del bättre ingår, huvudsakligen * och kvalitén är blandad men även felfria postfriska märken finns.. felfria ostämplade 50 öre och 1 krona