Arv og polymorfi

29
versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003. Kapittel 10 Programmering i Java http://www.tisip.no/Javabok/ Arv og polymorfi Repetisjon fra kap. 4 side 2-3 Generalisering og spesialisering side 4-5 Arv side 6-8 Polymorfi side 9 Gyldige tilordninger, referanser til objekter side 10 Abstrakte klasser side 11 Hva hvis polymorfi ikke hadde eksistert? side 12 Når har vi behov for å bruke instanceof? side 13 Tilgangsmodifikatorer side 14-16 Oppussingseksemplet, del 3 side 17-18 Arv i to nivåer side 19 Definisjoner og regler side 20-25 Interface side 26-29

description

Arv og polymorfi. Repetisjon fra kap. 4side 2-3 Generalisering og spesialiseringside 4-5 Arvside 6-8 Polymorfiside 9 Gyldige tilordninger, referanser til objekterside 10 Abstrakte klasserside 11 Hva hvis polymorfi ikke hadde eksistert?side 12 - PowerPoint PPT Presentation

Transcript of Arv og polymorfi

Page 1: Arv og polymorfi

versjon desember 2002Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal,

Stiftelsen TISIP og Gyldendal Akademisk 2003.Kapittel 10

Programmering i Javahttp://www.tisip.no/Javabok/

Arv og polymorfi

Repetisjon fra kap. 4 side 2-3Generalisering og spesialisering side 4-5Arv side 6-8Polymorfi side 9Gyldige tilordninger, referanser til objekter side 10Abstrakte klasser side 11Hva hvis polymorfi ikke hadde eksistert? side 12Når har vi behov for å bruke instanceof? side 13Tilgangsmodifikatorer side 14-16Oppussingseksemplet, del 3 side 17-18Arv i to nivåer side 19Definisjoner og regler side 20-25Interface side 26-29

Page 2: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 2

Et utsnitt avklassetreet i Java

Repetisjon fra kapittel 4Object

Component

Container

Window

Frame

JFrame

JComponent

JPanel

Vindu

Tegning

setSize(), setBackground() og getBackground() arves herfra

setDefaultClose- Operation() og getContentPane()arves herfra

add() arves herfra

superklasse tilJPanel og Tegning

subklasse tilObject og Component

show()arves herfra

setTitle()arves herfra

Page 3: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 3

Objektene som de ulike klassenebeskriver utgjør mengder

Repetisjon fra kapittel 4

Container

JComponent Window

Frame

JFrame

Vindu

JPanel

Tegning

Page 4: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 4

Generalisering og spesialisering

Student

fnrnavnadrstudnr

finnFnrfinnNavnfinnAdressefinnStudnr

Ansatt

fnrnavnadrlønnstrinn

finnFnrfinnNavnfinnAdressefinnLønnstrinn

Student

-studnr

+finnStudnr

Ansatt

-lønnstrinn

+finnLønnstrinn

generalisering,superklasse

spesialiseringer,subklasser

Person

-fnr-navn-adr

+finnFnr+finnNavn+finnAdresse

Object

. . .

resten av klassetreet

Page 5: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 5

Hva forteller klassetreet?

Person

AnsattStudent

En student er en person.En ansatt er en person.

Alle ansatte er en delmengdeav alle personer.Alle studenter er en delmengdeav alle personer.

Et klassetre viser et forhold som eksistererer mellom klasser. En klasse er en generalisering/spesialisering av en annen klasse.Pilen går fra den spesialiserte klassen til den generaliserte klassen.

Må ikke forveksles med assosiasjon. En assosiasjon mellom to klasser uttrykker at det eksisterer et forhold mellom objektene av de involverte klassene.

Gjør oppgave 1side 316.

Page 6: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 6

Arv

• En subklasse arver ikke-private medlemmer fra superklassen.

• Eksempel på konsekvenser: Til et objekt av klassen Student kan en klient sende følgende meldinger:

– finnFnr()

– finnNavn()

– finnAdresse()

– finnStudnr()

Student

-studnr

+finnStudnr

Ansatt

-lønnstrinn

+finnLønnstrinn

Person

-fnr-navn-adr

+finnFnr+finnNavn+finnAdresse

Gjør oppgave 2 side 316.

Page 7: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 7

Vis programliste 10.1 side 316-318.

Merk forskjellen mellom bruk av super for kall på konstruktører og kall på metoder:

– I en konstruktør må et eventuelt kall på super være første setning. • Kallet spesifiserer hvilken konstruktør som skal brukes i klassen rett over i klassetreet. • Eksempel: super(startFnr, startNavn, startAdr);

– super kan brukes som kvalifikator for å skille mellom arvede metoder og metoder med samme navn deklarert i den klassen der vi er. • Eksempel: super.toString();

Page 8: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 8

Hva med dataene i superklassen?

12106078756LOle Pettersen

Storgt 3, 7001 Trondheim1234567L

Student studenten = new Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L);

kun tilgjengelig via finn-metoder

privat i klassen Student

finnFnr()finnNavn()

finnAdresse()finnStudnr()

Et objekt av klassen Student har også objektvariablene fra Person (fødselsnummer,navn og adresse) inne i seg, men de kan bare nås via metoder arvet fra Person.

meldinger som kan sendes til studentobjektet

Page 9: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 9

Polymorfi

• Polymorfi = ”mangeformet, som opptrer i mange former”.• Polymorfi gjør det mulig å håndtere objekter av forskjellige klasser

under ett.• Vi har samlet objekter i en tabell Personer.• Sender samme melding til alle objektene, de tolker den forskjellig

avhengig av hvilken klasse de tilhører.

Person[] personer = new Person[3]; personer[0] = student1; // objekt av klassen Studentpersoner[1] = læreren; // objekt av klassen Ansattpersoner[2] = student2; // objekt av klassen Student

for (int i = 0; i < personer.length; i++) { // sender samme melding til alle objektene System.out.println(personer[i].toString()); }

Page 10: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 10

Gyldige tilordninger mellom referanser og objekter

Student enStudent

Ansatt enAnsatt

Person enPerson

12106078756L "Ole Pettersen"

"Storgt 3, 7001 Trondheim" 1234567L

5107078056L "Hanne Hansen"

"Storgt 13, 7001 Trondheim”40

12106078756L "Ola Nordmann"

"4567 Heia"

studentobjekt

ansattobjekt

personobjekt

Gjør oppgavene side 324.

Page 11: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 11

Abstrakte klasser• Formlene for å regne ut arealet er forskjellig for

sirkel, kvadrat og trekant.

• Men arealet kan beregnes for alle typer figurer.

• Metoden finnAreal() er polymorf (= ”mangeformet, som opptrer i mange former”).

• Metoden er abstrakt i klassen Figur (ikke mulig å finne en formel som gjelder for alle figurer).

• Klassen er abstrakt fordi den inneholder en abstrakt metode.

• Det er ikke mulig å lage objekter av en abstrakt klasse.

• En subklasse må implementere metoden for at det skal være mulig å lage objekter av subklassen. Klassen blir konkret.

• At metoden står i klassen Figur forteller at vi kan sende meldingen finnAreal() til alle objekter som tilhører konkrete subklasser av Figur.

Sirkel

-radius

+finnRadius+finnAreal

Trekant

-grunnlinje-høyde

+finnGrunnlinje+finnHøyde+finnAreal

Kvadrat

-side

+finnSide+finnAreal

Figur

+finnAreal

Vis programliste 10.3, side 326-328.Gjør oppgavene side 328.

Page 12: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 12

Hva hvis polymorfi ikke hadde eksistert?

• Hva gjør polymorfien for oss?– I det siste eksemplet lar den oss håndtere ulike typer geometriske figurer under ett.– Vi sender en melding til et objekt som tilhører en subklasse av Figur.– Objektet vet selv hvordan arealet skal regnes ut.

• Hva hvis objektet ikke selv visste hvilken formel som skulle brukes?– Da måtte vi bruke if-else-if, omtrent slik:

if (figur instanceof Sirkel) { ... formel for å beregne arealet av en sirkel … } else if (figur instanceof Kvadrat) { ... formel for å beregne arealet av et kvadrat … } else { ... formel for å beregne arealet av en trekant … }

• Tenk deg om en gang til dersom du tror at du trenger å bruke instanceof kombinert med en if-else-if-else-sekvens. – Du bør da vurdere om det er bedre å lage en abstrakt metode i en felles

superklasse for de involverte klassene, og så la hver enkelt klasse få sin egen implementasjon av metoden

Page 13: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 13

Når har vi behov for å bruke operatoren instanceof?

• Vi trenger å bruke instanceof i i de tilfellene der vi skal sende melding til kun en del av et subtre.• Vi lager følgende objekter:

A objekt1 = new C();A objekt2 = new E();

• Vi kan trygt sende meldingen metode1() til begge objektene:objekt1.metode1();objekt2.metode1();

• Meldingen metode2() kan vi bare sende til subklasser til klassen B:

if (objekt1 instanceof B) { B etObjekt = (B) objekt1; etObjekt.metode2();}

A

DCB

FE

metode1() abstrakt i A

metode2() abstrakt i B

metode1() implementert her

metode2() implementert her Gjør oppgaven side 331.

Page 14: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 14

Tilgangsmodifikatorer

• Definisjonsområdet til et navn er den delen av programmet der navnet kan brukes uten at det må kvalifiseres.

• Tilgjengeligheten til et navn utenfor definisjonsområdet er bestemt av om det står private, public, protected eller ingenting foran navnet (ingenting = package).

• Klasser:– Alle klasser vi har laget hittil,

unntatt appletene, har vært tilgjengelig kun i den pakken der de var deklarert.

– Appletene har hatt public foran seg. De er tilgjengelig fra overalt.

• Medlemmer og konstruktører:– private int antall; // privat

– protected int finnMinsteVerdi() { // tilgjengelig fra samme pakke// og fra subklasser (under // bestemte betingelser)

– public int finnAntall { // offentlig

– int finnHemmeligNummer() { // pakketilgang

• Klassetilgang overstyrer medlems/konstruktør-tilgang:

– Eksempel: For at et medlem (en konstruktør) skal være offentlig tilgjengelig må både medlemmet (konstruktøren) og klassen det tilhører være deklarert public.

Page 15: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 15

pakke A pakke B

klasse Csubklasse til klasse Cprivate

package*

protected

public

*) package betyr ingen tilgangsmodifikator

Tilgjengeligheten til konstruktører og medlemmer deklarert i klassen C

Page 16: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 16

Anbefalt bruk av tilgangsmodifikatorer

• Objektvariabler og klassevariabler er alltid private.

• Konstanter er vanligvis offentlige, men kan være private dersom de ikke er av interesse for andre enn klassen selv.

• Konstruktører er vanligvis offentlige.

• Metoder er vanligvis private eller offentlige.

• Konstruktører og metoder kan være beskyttede dersom det ikke har noen mening å bruke dem utenfor subklasser.

• Klasser har i utgangspunktet pakketilgang (ingen tilgangsmodifikator). Dette begrenser også tilgangen til offentlige konstruktører og medlemmer i klassen. Klasser som skal tas i bruk generelt, gjøres offentlige og legges i en navngitt pakke. Da vil automatisk alle offentlige konstruktører og medlemmer også bli offentlige.

Page 17: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 17

Oppussingseksemplet med mange flater og mange typer materialer

Belegg

-breddePåBelegg {frozen}

+finnMaterialbehov( enFlate: Flate)

Tapet

-lengdePrRull {frozen}-breddePrRull {frozen}

+finnMaterialbehov( enFlate: Flate)

Maling

-antStrøk {frozen}-antKvmPrLiter {frozen}

+finnMaterialbehov( enFlate: Flate)

Materiale

-navn {frozen}-pris {frozen}+finnTotalpris(enFlate: Flate)+finnMaterialbehov(enFlate: Flate)

Flate

+settMateriale( nyttMateriale: Materiale)+finnMateriale()+finnAreal()+finnOmkrets()

-navn {frozen}-lengde {frozen}-bredde {frozen}

*1

*1

trenger

består av

1

*

bruker

Materiale

Oppussingsprosjekt

registrerNyFlate( nyFlate: Flate)finnFlate(navn: String)finnAntFlater()finnFlate(indeks: int)registrerNyttMateriale( nyttMateriale: Materiale)finnMateriale(navn: String)finnAntMaterialer()finnMateriale(indeks: int)finnTotalpris()

navn: String {frozen}

Vis programliste 10.5, side 336-337.

Page 18: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 18

Oppussingseksemplet med mange flater og mange typer materialer, programmering

• Utsnitt fra kapittel 9:class Oppussingsprosjekt {

private String navn;

private ArrayList alleFlater = new ArrayList();

private ArrayList alleMalinger = new ArrayList();

public Maling registrerNyMaling(Maling nyMaling) {

Maling denne = finnMaling(nyMaling.finnNavn());

if (denne == null) {

alleMalinger.add(nyMaling);

return nyMaling;

}

else return denne;

}

• Nå, i kapittel 10:class Oppussingsprosjekt {

private String navn;

private ArrayList alleFlater = new ArrayList();

private ArrayList alleMaterialer = new ArrayList();

public Materiale registrerNyttMateriale(Materiale nyttMateriale) {

Materiale dette = finnMateriale(nyttMateriale.finnNavn());

if (dette == null) {

alleMaterialer.add(nyttMateriale);

return nyttMateriale;

}

else return dette;

}

En referanse til Materiale kan settes til å peke til et objekt av en hvilken som helst subklasse.

Vårt nye program kan håndtere mange forskjellige materialer, til tross for få endringer i forhold

til programmet i kapittel 9. Vi utnytter arv og polymorfi.

Page 19: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 19

Arv i to nivåer

Belegg2

-breddePåBelegg

+finnBredde()+finnMaterialbehov(enFlate: Flate)

Materiale

-navn-pris

+finnNavn()+finnPrisPrEnhet()+finnTotalpris(enFlate: Flate)+finnMaterialbehov(enFlate: Flate)

ForsteSortBeleggAnnenSortBelegg

+finnTotalpris(enFlate: Flate)+finnMaterialbehov(enFlate: Flate)

Tapet

-lengdePrRull-breddePrRull

Maling

-antStrøk-antKvmPrLiter

+finnAntStrøk()+finnAntKvmPrLiter()+finnMaterialbehov(

enFlate: Flate)

+finnLengde()+finnBredde()+finnMaterialbehov( enFlate: Flate)

Vis programliste 10.6 side 340-341.

Page 20: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 20

Modifikatoren abstract

• Abstrakt klasse:abstract class Materiale {

….osv.– kan ikke lage objekter av en abstrakt klasse

– behøver ikke inneholde eller arve abstrakte metoder

– kan inneholde både abstrakte og konkrete metoder

• Abstrakt metode:abstract metodehode;– En klasse som arver, eller selv deklarerer en abstrakt metode, må

deklareres som abstrakt.

Page 21: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 21

Det reserverte ordet super

• super kan brukes på to måter:– I en konstruktør for å anrope konstruktøren rett over i klassetreet,

eksempel: public AnnenSortBelegg(String startNavn, double startPris, int

startBredde) { super(startNavn, startPris, startBredde); }• Kallet på super() må være første setning i konstruktøren.• Argumentlisten til super() må være i samsvar med parameterlisten til en

konstruktør i superklassen.

– I en hvilken som helst metode kan vi bruke super som kvalifikator for å henvise til et skjult eller erstattet navn i en superklasse, eksempel:

public double finnMaterialbehov(Flate enFlate) { double grunnBehov = super.finnMaterialbehov(enFlate); return grunnBehov * materialTillegg; }

• Vi kan ikke skrive super.super() eller lignende for å anrope konstruktør eller metode på mer enn ett nivå over i klassetreet.

Page 22: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 22

Konstruktører

• Dersom vi ikke kaller en bestemt konstruktør i den direkte superklassen ved å anrope super(), vil standardkonstruktøren i superklassen anropes.

• Dersom denne ikke eksisterer, vil kompilatoren gi en feilmelding.

• Dersom det ikke har mening å lage objekter av en klasse, kan det forhindres på to måter:– Lag klassen abstrakt. Dette brukes dersom klassen har eller kan ha

subklasser.

– Lag alle konstruktører private. Dette brukes dersom klassen ikke kan ha subklasser (den er final, se nedenfor).

Page 23: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 23

Referanser og casting

• En referanse til en klasse kan settes til å peke til objekter av en subklasse til klassen. Den kan ikke settes til å peke til objekter av en superklasse.

Person personen =new Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L); // ok

Ansatt læreren = new Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L); // ikke ok

Ansatt læreren = new Person(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim"); // ikke ok

• Anta at vi har en referanse til et objekt. – Referansen kan castes til den klassen objektet tilhører, eller til superklasser av denne klassen.

– Det er ikke tillatt å caste referansen til en subklasse av den klassen som objektet tilhører.

– Ugyldig casting gir ClassCastException.

Object etObjekt = new Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L); // ok

Student enStudent = (Student) etObjekt;Ansatt enAnsatt = (Ansatt) etObjekt; // ikke okPerson enPerson = (Person) etObjekt; // ok

Person

AnsattStudent

Page 24: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 24

Modifikatoren final

• final forhindrer subklassing og erstatning.

• En final metode kan ikke erstattes eller skjules:public final double finnBredde() { return breddePåBelegg; }

• Det er ikke mulig å subklasse en final klasse:final class AnnenSortBelegg extends Belegg2 { ….osv.

Page 25: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 25

Å erstatte eller skjule et navn

• Å erstatte en arvet objektmetode– Hvis en klasse deklarerer en objektmetode, vil denne deklarasjonen

erstatte en eventuell arvet metode med samme signatur. – Kompilatoren gir feilmelding dersom returtypen ikke stemmer og/eller

tilgangsnivået er mindre strengt enn i den erstattede metoden. – En objektmetode kan ikke erstatte en arvet klassemetode.

class AnnenSortBelegg extends Belegg2 { ….. public double finnMaterialbehov(Flate enFlate) { double grunnBehov = super.finnMaterialbehov(enFlate); return grunnBehov * materialTillegg; }}

Denne metoden erstatter den arvede

utgaven av finnMaterialbehov()

Vi kan skjule arvede variabelnavn og klassemetoder.Dette brukes ikke i denne boka.

Her refererer vi tilden erstattede metoden.

Page 26: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 26

Interface

• Et interface er en samling med metodehoder. • En klasse kan velge å implementere et interface. Den må da programmere alle

metodene i interfacet. • Eksempel på interface:

public interface Comparable { // tilhører pakken java.lang public int compareTo(Object obj);}

• Eksempel på klasse som implementerer interfacet:class Flate implements Comparable { ....objektvariabler.... public int compareTo(java.lang.Object obj) { // sammenligner arealene Flate denAndreFlaten = (Flate) obj; double areal1 = finnAreal(); // arealet til this double areal2 = denAndreFlaten.finnAreal(); if (areal1 < areal2 - 0.0001) return -1; else if (areal1 > areal2 + 0.0001) return 1; else return 0; } .....andre metoder i klassen....}

Repetisjon fra kapittel 9.

Page 27: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 27

Å lage egne interface

interface Sammenligningsbar { boolean størreEnn(Object obj); boolean mindreEnn(Object obj); boolean lik(Object obj);}

interface Konstanter { int min = 1000; int maks = 9999;}

Tilgangsmodifikatorpublic eller ingenting (pakketilgang)

public abstract underforstått for

metoder

public static final underforstått for

variabler

Et interface er abstrakt, vi kan ikke lage objekter av et interface.

Page 28: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 28

Implementasjon av interfacene

class FireSifretHeltall implements Konstanter, Sammenligningsbar { private int verdi; public FireSifretHeltall(int startVerdi) { if (startVerdi < min) verdi = min; else if (startVerdi > maks) verdi = maks; else verdi = startVerdi; } public int finnVerdi() { return verdi; } public boolean størreEnn(Object obj) { FireSifretHeltall tall = (FireSifretHeltall) obj; return (verdi > tall.finnVerdi()); } public boolean mindreEnn(Object obj) { FireSifretHeltall tall = (FireSifretHeltall) obj; return (verdi < tall.finnVerdi()); } public boolean lik(Object obj) { FireSifretHeltall tall = (FireSifretHeltall) obj; return (verdi == tall.finnVerdi()); }}

Klassen kan bruke allekonstantene i interfacetKonstanter.

Klassen må implementerealle metodene i interfacetSammenligningsbar, for atklassen ikke skal bli abstrakt.

Page 29: Arv og polymorfi

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 10, side 29

Bruk av klassen FireSifretHeltall

• En referanse av en interface-type kan referere til objekter som tilhører en klasse som implementerer interfacet:

– Sammenligningsbar tall1 = new FireSifretHeltall(700);– Sammenligningsbar tall2 = new FireSifretHeltall(1700);

• Vi kan nå bare sende meldinger deklarert i interfacet til objektet:– System.out.println(tall1.størreEnn(tall2)); // ok– System.out.println(tall1.finnVerdi()); // ikke ok

class EksempelInterface { public static void main(String[] args) { FireSifretHeltall tall1 = new FireSifretHeltall(700); FireSifretHeltall tall2 = new FireSifretHeltall(1700); FireSifretHeltall tall3 = new FireSifretHeltall(70000); System.out.println(tall1.finnVerdi()); System.out.println(tall2.finnVerdi()); System.out.println(tall3.finnVerdi()); System.out.println(tall1.størreEnn(tall2)); System.out.println(tall1.mindreEnn(tall2)); System.out.println(tall1.lik(tall2)); }}

Utskrift:/*100017009999falsetruefalse*/