INF1010 våren Interface (Grensesnitt)

Like dokumenter
INF1010 våren Grensesnitt (interface)

INF1010 våren Grensesnitt

INF1010 våren Grensesnitt

INF1010 våren januar. Objektorientering i Java

IN1010 våren januar. Objektorientering i Java

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, subklasser og grensesnitt - del 2

INF1010 våren Arv og subklasser del 1

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

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

INF1010 våren Arv og subklasser - del 2

Enkle generiske klasser i Java

2 Om statiske variable/konstanter og statiske metoder.

INF1010. Grensesnittet Comparable<T>

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

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF våren 2017

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser - del 2

INF Seminaroppgaver til uke 3

Introduksjon til objektorientert programmering

Velkommen til. INF våren 2016

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

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

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

UNIVERSITETET I OSLO

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Grensesnitt i Java (engelsk: interface) Oslo, 10/1-14

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

2 Om statiske variable/konstanter og statiske metoder.

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

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

Interface i Java 8. Februar 2017

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

UNIVERSITETET I OSLO

Seminaroppgaver IN1010, uke 2

Gjennomgang av eksamen H99

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Obligatorisk oppgave 4: Lege/Resept

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Dagens tema INF1010 INF1010 INF1010 INF1010

INF1010 våren 2008 Uke 4, 22. januar 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; }

UNIVERSITETET I OSLO

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

UNIVERSITETET I OSLO

Løsningsforslag Test 2

INF1010. Stein Michael Storleer (michael) Lenkelister

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

OPPGAVE 5b og 8b Java Kode

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

UNIVERSITETET I OSLO

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Dagens tema Kapittel 8: Objekter og klasser

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

Forelesning inf Java 4

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

Kapittel 8: Programutvikling

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

UNIVERSITETET I OSLO

INF Notater. Veronika Heimsbakk 10. juni 2012

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

UNIVERSITETET I OSLO

INF1010 siste begreper før oblig 2

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

Generiske mekanismer i statisk typede programmeringsspråk

UNIVERSITETET I OSLO

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010 Binære søketrær ++

INF 1010, vår 2005 Løsningsforslag uke 11

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

UNIVERSITETET I OSLO

Endret litt som ukeoppgave i INF1010 våren 2004

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

UNIVERSITETET I OSLO

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

Transkript:

INF1010 våren 2016 Torsdag 28. januar Interface (Grensesnitt) og litt annet, bl.a. om enhetstesting Stein Gjessing Institutt for informatikk

Dagens tema n n Norsk: Grensesnitt Engelsk: Interface n Les notatet Grensesnitt i Java av Stein Gjessing n Det finnes haugevis med litteratur om grensesnitt i Java, men mye av det forutsetter at du har lært om subklasser først (dette gjelder også Horstmann). Derfor er det kanskje lurt å vente med å lese andre kilder til du har lært om subklasser (neste uke). 2

Hva er objektorientert programmering? Hva er et objekts grensesnitt mot omverdenen? Svar: De public metodene. F.eks: En sort boks som tar vare på tall: public void settinn(int tall) public int taut( ) Ukjent implementasjon av metode Ukjent implementasjon av metode Ukjente private data og ukjente private metoder Dette er IKKE nytt. Dette snakket de bl.a. mye om i INF1000 i høst. 3

Hva er objektorientert programmering? public -metoder definerer objektets grensesnitt mot omverdenen Så dette vet vi allerede Ja, men det finnes noe i Java som gjør at vi kan legge enda mer vekt på et objekts grensesnitt La oss se på eksempelet med et objekt som tar vare på tall 4

public void settinn(int tall) public int taut( ) Med Java koden under kan vi senere lage objekter med slik oppførselen Nytt Java-nøkkelord: interface interface Heltallsbeholder { public void settinn(int tall); public int taut( ); new Heltallsbeholder() Java kode 5

Klasser implementerer grensesnitt interface Heltallsbeholder { public void settinn(int tall); public int taut( ); public void settinn(int tall) public int taut( ) En tankemodell av et mulig senere objekt Da kan vi lage en klasse som vi kan lage objekter av: class MinHeltallsbeholder implements Heltallsbeholder { private public void settinn(int tall) { public int taut( ) { Nytt Java nøkkelord: implements new MinHeltallsbeholder() gir dette objektet: public void settinn(int tall) public int taut( ) privat datastruktur Objekt av klassen MinHeltallsbeholder 6

Typen til pekeren er navnet på klassen interface Heltallsbeholder { public void settinn(int tall); public int taut( ); public void settinn(int tall) public int taut( ) En tankemodell av et mulig senere objekt class EnkelHeltallsbeholder implements Heltallsbeholder { private public void settinn(int tall) { public int taut( ) { Type: EnkelHeltallsbeholder Navn: beholder public void settinn(int tall) public int taut( ) class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) { EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); Objekt av klassen EnkelHeltallsbeholder 7

Typen til pekeren er navnet på et interface interface Heltallsbeholder { public void settinn(int tall); public int taut( ); public void settinn(int tall) public int taut( ) En tankemodell av et mulig senere objekt class EnkelHeltallsbeholder implements Heltallsbeholder { private public void settinn(int tall) { public int taut( ) { Type: Heltallsbeholder Navn: beholder public void settinn(int tall) public int taut( ) class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) { Heltallsbeholder beholder = new EnkelHeltallsbeholder(); Objekt av klassen EnkelHeltallsbeholder 8

Typen til pekeren er navnet på klassen interface Heltallsbeholder { public void settinn(int tall); public int taut( ); public void settinn(int tall) public int taut( ) En tankemodell av et mulig senere objekt class EnkelHeltallsbeholder implements Heltallsbeholder { private int tallet = -1; public void settinn(int tall) { tallet = tall; public int taut( ) { int temp= tallet; tallet = -1; return temp; FULLSTENDIG KJØRBART PROGRAM Type: EnkelHeltallsbeholder public void settinn(int tall) public int taut( ) Navn: beholder class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) { EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); beholder.settinn(17); if (beholder.taut() == 17) {System.out.println ( Riktig ); else {System.out.println( Feil ); tallet Objekt av klassen EnkelHeltallsbeholder 9

Typen til pekeren er navnet på et interface interface Heltallsbeholder { public void settinn(int tall); public int taut( ); public void settinn(int tall) public int taut( ) En tankemodell av et mulig senere objekt class EnkelHeltallsbeholder implements Heltallsbeholder { private int tallet = -1; public void settinn(int tall) { tallet = tall; public int taut( ) { int temp= tallet; tallet = -1; return temp; FULLSTENDIG KJØRBART PROGRAM Type: Heltallsbeholder public void settinn(int tall) public int taut( ) Navn: beholder class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) { Heltallsbeholder beholder = new EnkelHeltallsbeholder(); beholder.settinn(17); if (beholder.taut() == 17) {System.out.println ( Riktig ); else {System.out.println( Feil ); tallet Objekt av klassen EnkelHeltallsbeholder 10

Så, hva skal vi med dette? Hva brukes interface til? Vet hjelp av interface kan forskjellige klasser og objekter ha det samme grensesnittet. Dette er en fordel når vi skal beskrive objekter med felles egenskaper. Et interface kalles gjerne en rolle Noen objekter kan spille flere forskjellig roller Forskjellige objekter kan implementere samme rolle på forskjellige måter - innkapsling = skjuling av detaljer MYE MER I EKSEMPLER Hvorfor -1 på forrige foil? Hva bør vi gjøre når beholderen er tom? Oppgave: Modifiser interfacet og klassen slik at man kan teste om beholderen er tom? 11 Til senere: Kast et unntak om programmet prøver å ta et tall ut av en tom beholder

Nå noe som ikke bare gjelder interface, men også klasser: Metodenes signaturer public void settinn(int tall) public int taut( ) Dette kaller vi metodenes signaturer (skrivemåte, syntaks) Signaturen til en metode er - navnet på metoden - navnene, typene og rekkefølgen til parametrene - retur-typen (?) 12

Metodenes semantikk public void settinn(int tall) public int taut( ) Hva gjør disse metodene? Hvordan virker de? Hva er sematikken til metodene? Semantikk betyr virkemåte 13

Metodenes semantikk public void settinn(int tall) public int taut( ) Metoden settinn gjør at objektet tar vare på tallet som er parameter til metode. Metoden taut sletter fra objektet et av de tallene som tidligere er satt inn. Metoden returnerer det tallet som slettes. Informatikkens 3. (?) lov: Først betemmer vi semantikken og signaturene Deretter implementerer vi metodene og bestemmer oss for hva de private dataene skal være Dette gjelder for alle programmeringsspråk, det er ikke Java-spesifikt. 14

interface Heltallsbeholder { public void settinn(int tall); public int taut( ); Semantikk: Metoden settinn gjør at objektet tar vare på tallet som er parameter til metoden. Metoden taut sletter fra objektet et av de tallene som tidligere er satt inn. Metoden returnerer det tallet som er slettet. class EnkelHeltallsbeholder implements Heltallsbeholder { private int tallet = -1; public void settinn(int tall) { tallet = tall; public int taut( ) { int temp= tallet; tallet = -1; return temp; Kompilatoren sjekker at implementasjonen har de riktige metodene med de riktige parameterene (riktig signatur) MEN: Bare du, som er et menneske, kan sjekke at implementasjonen overholder de SEMANTISKE KRAVENE til metodene. 15

Institutt for informatikk har 12 forskningsgrupper. En av disse heter Presis Modellering og Analyse (PMA). Her arbeider de bl.a. med å formalisere disse sematiske kravene, slik at du kan få hjelp av datamaskinen til å sjekke at implementasjonen overholder de semantiske kravene. Litt mer på en senere forelesning. public void settinn(int tall) public int taut( ) De sematiske kravene kalles også en kontrakt (mellom brukerene av objektet og objektet selv) 16

Med Javadoc kan vi beskrive både signatur og semantikk /** Objektene av alle klassene som implementerer dette gresesnittet tar vare * på heltall. * * @author Stein Gjessing * versjon 10. februar 2012 */ public interface Heltallsbeholder { /** * Gjør at objektet tar vare på tallet som er parameter til metoden * *@param tall tallet som objektet skal ta vare på */ public void settinn(int tall); /** * Sletter fra objektet et av de tallene som tidligere er satt inn. * Metoden returnerer det tallet som er slettet. * *@return tallet som er slettet */ public int taut( ); Filen Heltallsbeholder.java 17

18

Flere eksempler: Kaniner og kaninbur class Kanin{ String navn; Kanin(String nv) {navn = nv; interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); class Kaninbur implements KaninOppbevaring { private public boolean settinn(kanin k) {..... public Kanin taut( ) {... 19

Igjen: Signatur (syntaks) og Sematikk Signaturer: interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); Semantikk: Hvis objektet er tomt vil metoden settinn gjøre at objektet tar vare på kaninen som er parameter til metoden, og metoden returnerer sann. Hvis objektet allerede inneholder en kanin gjør metoden ingen ting med objektet, og metoden returnerer usann. Metoden taut tar ut kaninen som er i objektet og returnerer en peker til denne kaninen. Metoden returnerer null hvis objektet allerede er tomt.

class Kanin{ String navn; Kanin(String nv) {navn = nv; Kaniner og kaninbur: Full kode interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); class Kaninbur implements KaninOppbevaring { private Kanin denne = null; public boolean settinn(kanin k) { if (denne == null) { denne = k; return true; else return false; public Kanin taut( ) { Kanin k = denne; denne = null; return k; 21

Vi forlater interface en stund: Testing -- Enhetstesting n n n n Når vi planlegger og skriver programmet prøver vi å overbevise oss selv (og dem vi skriver sammen med) om at den koden vi skriver kommer til å utføre det vi ønsker Men vi kommer alltid til å tenke/skrive feil Derfor må vi teste programmet vårt Objektorientering / modularisering: n Test et objekt eller en modul om gangen n n Sørg for at den er så riktig som mulig Deretter kan vi test sammensettingen av objektene / modulene 22

Modifikatorer og Observatorer En modifikator-metode forandrer tilstanden til et objekt En observator-metode leser av tilstanden uten å forandre den Et objekt Tilstand som er skjult utenfor Modifikatorer Observatorer........ Modifikator, f.eks. set(). Observator, f.eks. get() 23

Tes$ng - - Enhetstes$ng n Når vi skal teste et objekt kan vi først kalle en modifikator- metode og dere8er en observator- metode og se om vi observerer det ønskede resultat Modifikatorer Observatorer Et objekt........ Modifikator, f.eks. set(). Observator, f.eks. get() 24 24

interface Heltallsbeholder { public void settinn(int tall); public int taut( ); Enhetstesting av heltallsbeholderen class EnkelHeltallsbeholder implements Heltallsbeholder { private int tallet = -1; public void settinn(int tall) { tallet = tall; public int taut( ) { int temp= tallet; tallet = -1; return temp; Type: EnkelHeltallsbeholder Navn: beholder modifikator observator public void settinn(int tall) public int taut( ) class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) { EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); beholder.settinn(17); if (beholder.taut() == 17) {System.out.println ( Riktig ); else {System.out.println( Feil ); tallet Objekt av klassen EnkelHeltallsbeholder 25

Enhetstesting av heltallsbeholderen med egen test-metode class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); int resultat; int testtall; testtall = 17; beholder.settinn(testtall); resultat = beholder.taut(); test(testtall,resultat); static void test(int tall1, int tall2) { System.out.println( Test av settinn / taut ); System.out.println( Resultat + tall1 + / + tall2); if (tall1 == tall2) {System.out.println ( Riktig ); else {System.out.println( Feil ); public void settinn(int tall) public int taut( ) Type: EnkelHeltallsbeholder modifikator observator Navn: beholder tallet Objekt av klassen EnkelHeltallsbeholder Må gjøre dette for flere tall enn 17 (men hvilke??) Må gjøre dette for flere kombinasjoner av metodekall (men hvilke??) 26

class EnkelHeltallsbeholder implements Heltallsbeholder { private int tallet = -1; public void settinn(int tall) { tallet = 17; public int taut( ) { int temp= tallet; tallet = -1; return temp; class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) Program med feil - 1 EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); int resultat; int testtall; testtall = 17; beholder.settinn(testtall); resultat = beholder.taut(); test(testtall,resultat); static void test(int tall1, int tall2) { System.out.println( Test av settinn / taut ); System.out.println( Resultat + tall1 + / + tall2); if (tall1 == tall2) {System.out.println ( Riktig ); else {System.out.println( Feil ); interface Heltallsbeholder { public void settinn(int tall); public int taut( ); 27

class EnkelHeltallsbeholder implements Heltallsbeholder { private int tallet = -1; public void settinn(int tall) { if(tall == 3172) tallet = 0; else tallet = tall; public int taut( ) { int temp= tallet; tallet = -1; return temp; class MegetEnkelTestAvBeholder { public static void main (String[ ] argumenter) Program med feil - 2 EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); int resultat; int testtall; testtall = 17; beholder.settinn(testtall); resultat = beholder.taut(); test(testtall,resultat); static void test(int tall1, int tall2) { System.out.println( Test av settinn / taut ); System.out.println( Resultat + tall1 + / + tall2); if (tall1 == tall2) {System.out.println ( Riktig ); else {System.out.println( Feil ); interface Heltallsbeholder { public void settinn(int tall); public int taut( ); 28

Enhetstesting av class Kaninbur class Kanin{ String navn; Kanin(String nv) {navn = nv; interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); // Testprogram: public static void main ( ) { KaninOppbevaring detguleburet = new Kaninbur( ); Type: KaninOppbevaring Ins$tu' for informa$kk class Kaninbur implements KaninOppbevaring {... Navn: detguleburet Kanin kalle = new Kanin("Kalle"); Type: Kanin Type: Kanin Navn: kalle detguleburet.settinn(kalle) Navn: denne Objekt av klassen Kanin Kanin sprett = new Kanin("Sprett"); boolean settinnok = detguleburet.settinn(sprett); test( Test inn i fullt bur, settinnok);... Kanin taut( ) Objekt av klassen Kaninbur implements KaninOppbevaring Type: Kanin Navn: sprett...... boolean settinn (Kanin den) Objekt av klassen Kanin

Enhetstest av class Kaninbur Ins$tu' for informa$kk Lag egne testmetoder (IKKE slik jeg har gjort her) Kalle class LittTestKaninbur { public static void main (String [ ] args) { KaninOppbevaring detguleburet = new Kaninbur( ); Kanin kalle = new Kanin("Kalle"); detguleburet.settinn(kalle); Kanin sprett = new Kanin( Sprett ); // tester at andre kanin ikke kommer inn i buret: booelan settinnok = detguleburet.settinn(sprett); if (settinnok) { System.out.prinln( Feil sett inn ); else {System.out.prinln( Riktig sett inn ); // tester at den som først ble satt inn nå tas ut: Kanin enkanin = detguleburet.taut( ); if (enkanin.navn.equals( Kalle ) { System.out.prinln( Riktig ta ut ); else {System.out.prinln( Feil ta ut ); Enhetstesting bør vi gjøre på alle klasser (uavhengig av om de implementerer et interface) Sprett Pelle 30

Tilbake til interface Et grensesnitt beskriver en rolle som alle objektene som implementerer dette grensesnittet må kunne spille public boolean settinn(kanin k) public Kanin taut( ) Et objekt av en klasse som implementerer grensesnittet Kaninoppbevaring Men objektene kan gjerne ha andre metoder i tillegge (kunne spille andre roller også) (mye mer om dette i februar)

Men objektene kan gjerne ha andre metoder i tillegge class KaninburMedLys implements KaninOppbevaring { private boolean lys = false; private Kanin denne = null; public boolean settinn(kanin k) { public Kanin taut( ) { public void tennlyset ( ) {lys = true; public void slukklyset ( ) {lys = false; interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); 32

KaninburMedLys: Full kode class KaninburMedLys implements KaninOppbevaring { private boolean lys = false; private Kanin denne = null; public boolean settinn(kanin k) { if (denne == null) { denne = k; return true; else return false; public Kanin taut( ) { Kanin k = denne; denne = null; return k; public void tennlyset ( ) {lys = true; public void slukklyset ( ) {lys = false; interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); 33

KaninburMedLys: et objekt Type: KaninburMedLys Navn: Type: KaninOppbevaring Navn: Objekt av klassen Kanin Objekt av klassen KaninburMedLys implements KaninOppbevaring boolean settinn (Kanin den ) Kanin taut ( ) Type: Kanin void tennlyset( ) Navn: denne Type: boolean Navn: lys interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); Vi kan se på objektet både med KaninburMedLys -briller og med KaninOppbevaring -briller void slukklyset( ) Forskjellige briller = forskjellige roller

class KaninburMedLys implements KaninOppbevaring, Lys { private boolean lys = false; Vi kan lage kassen KaninburMedLys på en annen måte: Én klasse to grensesnitt private Kanin denne = null; public boolean settinn(kanin k) { public Kanin taut( ) { public void tennlyset ( ) {lys = true; public void slukklyset ( ) {lys = false; interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); interface Lys { public void tennlyset ( ); public void slukklyset ( ); 35

Étt objekt to grensesnitt tre briller Type: KaninburMedLys Navn: nyttburlys Type: KaninOppbevaring Navn: detnyeburet Type: Lys Navn: detnyeburet Objekt av klassen KaninburMedLys implements KaninOppbevaring, Lys boolean settinn (Kanin den ) Kanin taut ( ) Type: Kanin void tennlyset( ) Navn: denne Type: boolean Navn: lys interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); interface Lys { public void tennlyset ( ); public void slukklyset ( ); Vi kan se på objektet både med KaninburMedLys -briller og med KaninOppbevaring -briller og med Lys -briller Objekt av klassen Kanin void slukklyset( ) Forskjellige briller = forskjellige roller 36

Én klasse to grensesnitt: Full kode class KaninburMedLys implements KaninOppbevaring, Lys { private boolean lys = false; private Kanin denne = null; public boolean settinn(kanin k) { if (denne == null) { denne = k; return true; else {return false; public Kanin taut( ) { Kanin k = denne; denne = null; return k; public void tennlyset ( ) {lys = true; public void slukklyset ( ) {lys = false; interface KaninOppbevaring { public boolean settinn(kanin k); public Kanin taut( ); interface Lys { public void tennlyset ( ); public void slukklyset ( ); 37

Flere eksempler: En klasse mange grensesnitt interface KanBjeffe{ void bjeff(); interface Utkledd { int antallfarger(); Foto: AP class Karnevalshund implements KanBjeffe, Utkledd { private int farger; Karnevalshund (int frg) { farger = frg; public void bjeff( ) { System.out.printl( Voff - voff ); public int antallfarger() { return farger; 38

Karnevalshund passopp = new Karnevalshund( ): KanBjeffe gneldrebikkje = passopp; Utkledd godhunden = passopp; Type: Karnevalshund Navn: denne Type: KanBjeffe Navn: gneldrebikkje Type: Utkledd Navn: godhund Type: int Navn: farger void bjeff ( ) {System.out.printl( Voff - voff ); int antallfarger( ) {return farger; Objekt av klassen Karnevalshund KanBjeffe rollen Utkledd rollen 39

Enda et eksempel : interface KanBjeffe{ void bjeff(); interface Svigermor{ boolean okpaabesok(); class NorskSvigermor extends KanBjeffe, Svigermor { boolean hyggelig = false; public void bjeff( ) { System.out.println( Uff uff ); public boolean okpaabesok() { return hyggelig; Oppgave: Tegn opp et objekt av klassen NorskSvigermor og tre pekere av forskjellige typer. Hvilke roller kan dette objektet spille? Hva ser vi ved hjelp av de forskjellige pekerene? 40

Ett grensesnitt, flere klasser: Eksempel: Både biler og ost skal skattlegges interface Skattbar{ int skatt(); // Skatt på importerte varer class Bil implements Skattbar { // Bil: 100% skatt private private int importpris; Bil ( ) { public int skatt( ){return importpris; class Ost implements Skattbar { // Ost: 200% skatt private int importprisprkg; private int antkg; Ost ( ) { public int skatt( ){return importprisprkg*antkg*2.00; 41

n Legg merke til at metoden skatt er implementert på forskjellige måter i Bil og Ost. Bil minbil = new Bil ("BP12345", 100000); Skattbar minbs = minbil; Ost minost = new Ost(100, 2); Skattbar minos = minost; int bilskatt = minbil.skatt(); int osteskatt = minost.skatt(); int skatt = bilskatt + osteskatt; // bedre: int totalskatt = 0; totalskatt = totalskatt + minbs.skatt(); totalskatt = totalskatt + minos.skatt(); Type: Bil Navn: minbil Type: Skattbar Navn: minbs Type: Ost Navn: minost Type: Skattbar Navn: minos Rollen Skatt Rollen Bil (untatt Skatt) Rollen Ost (untatt Skatt) Generalisering på neste side 42

Samlet import-skatt Skattbar[ ] alle = new Skattbar [100]; alle[0] = new Bil( DK12345, 150000); alle[1] = new Ost(20,5000); int totalskatt = 0; Type: Skattbar [ ] Navn: alle for (Skattbar den: alle) { if (den!= null) {totalskatt = totalskatt + den.skatt(); System.out.println( Total skatt: + totalskatt); Rollen Skatt Rollen Bil (untatt Skatt) Rollen Ost (untatt Skatt) Veldig viktig og bra eksempel. Dagens rosin. 43

Bil og Ost Full kode interface Skattbar{ int skatt(); // Skatt på importerte varer class Bil implements Skattbar { // Bil: 100% skatt private String regnr; private int importpris; Bil (String reg, int imppris) { regnr = reg; importpris = imppris; public int skatt( ){return importpris; public String hentregnr( ) {return regnr; class Ost implements Skattbar { // Ost: 200% skatt private int importprisprkg; private int antkg; Ost (int kgpris, int mengde) { importprisprkg = antkg; antkg = mengde; public int skatt( ){return importprisprkg*antkg*2.00; 44

Generiske grensesnitt Grensesnitt med parametre n På samme måte som klasser, kan interface lages med parametre. n FØR har vi lært: class Beholderen <E> { n NÅ skal vi lære: interface Beholder <E> { new Beholderen<Bil>( ); new Beholder<Bil>( ); 45

Før: class GeneriskBeholderTilEn <T> { T denne; public void settinn (T en) { denne = en; public T taut ( ) {return denne; Generisk grensesnitt Nå: interface Beholder <E> { public void settinn (E en); public E taut ( ); class GeneriskBeholderTilEn <T> implements Beholder <T> { T denne; public void settinn (T en) { denne = en; public T taut ( ) {return denne; 46

Mer grensesnitt med parametre (Generiske grensesnitt) interface EnkelStorBeholder <E> { public boolean settinn (E elem); public E finnen( ); public void fjern( ); Her ønsker vi å lage et grensesnitt til en beholder som kan ta vare på mange elementer (mange objekter av klassen E). Men hva er sematikken til metodene / til grensesnittet? Hvilken semantikk ønsker vi egentlig? Hva ønsker vi å kreve av klassene som implementerer dette grensesnittet? ikke nå 47

class KonkretEnkelStorBeholder <E> implements EnkelStorBeholder<E> { private E [ ] alle = (E [ ] ) new Object [100]; private int antall = 0; public boolean settinn(e elem) { navn: alle type: E[] navn: antall 7 public E finnen( ) { type: int settinn finnen public void fjern( ) { fjern Forslag til implementasjon Slike objekter finnes ikke (må gi E en verdi først) 48

class KonkretEnkelStorBeholder <E> implements EnkelStorBeholder<E> { private E [ ] alle = (E [ ] ) new Object [100]; private int antall = 0; public boolean settinn(e elem) { navn: alle if (antall ==100) {return false; alle[antall] = elem; type: E[] antall ++; return true; navn: antall 7 public E finnen( ) { type: int if (antall == 0) {return null; settinn return alle[antall-1]; finnen public void fjern( ) { if(antall!= 0) {antall -- ; fjern Implementasjon: Full kode Slike objekter finnes ikke (må gi E en verdi først) 49

50 Bruk av denne implementasjonen - testing EnkelStorBeholder<KarnevalsHund> mittstorehundehus = new KonkretEnkelStorBeholder<KarnevalsHund> ( ); KarnevalsHund fido = new KarnevalsHund(7); mittstorehundehus.settinn(fido); KarnevalsHund passopp = new KarnevalsHund(4); mittstorehundehus.settinn(passopp); KarnevalsHund enhund = mittstorehundehus.finnen( ); if (enhund == fido enhund == passopp) {System.out.println( Riktig finn 1 ); else {System.out.println( Feil finn 1 ); navn: alle type: KarnevalsHund[] navn: antall 3 type: int settinn(karnevalshund det) KarnevalsHund finnen( ) void fjern( ) fido passopp trofast

Enda bedre : (?) 3 observatorer 2 modifikatorer interface EnkelStorBeholder <E> { public boolean full( ); public boolean tom ( ); public E finnen( ); public void settinn (E elem); public void fjern( ); Men at vi bare skal ha helt rene observatorer og helt rene modifikatorer er kanskje å drive det litt langt 51