INF1010 våren Grensesnitt

Like dokumenter
INF1010 våren Grensesnitt

INF1010 våren Grensesnitt (interface)

INF1010 våren Interface (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, subklasser og grensesnitt - del 2

INF1010 våren Arv og subklasser del 1

INF1010 våren Arv og subklasser del 1

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

INF1010 våren Arv og subklasser - del 2

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

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

Enkle generiske klasser i Java

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

Interface i Java 8. Februar 2017

INF1010. Grensesnittet Comparable<T>

INF1010 våren Arv og subklasser - del 2

2 Om statiske variable/konstanter og statiske metoder.

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

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

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

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

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

UNIVERSITETET I OSLO

Gjennomgang av eksamen H99

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

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

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

UNIVERSITETET I OSLO

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; }

IN våren 2019 Onsdag 16. januar

INF Seminaroppgaver til uke 3

INF våren 2017

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

UNIVERSITETET I OSLO

IN våren 2018 Tirsdag 16. januar

OPPGAVE 5b og 8b Java Kode

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

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

UNIVERSITETET I OSLO

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

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

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

Introduksjon til objektorientert programmering

Dagens tema INF1010 INF1010 INF1010 INF1010

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

Seminaroppgaver IN1010, uke 2

UNIVERSITETET I OSLO

INF Notater. Veronika Heimsbakk 10. juni 2012

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

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

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

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

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

INF1010. Stein Michael Storleer (michael) Lenkelister

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

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

INF1010 våren Arv og subklasser - del 2

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

Løsningsforslag Test 2

Obligatorisk oppgave 4: Lege/Resept

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

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

INF Løsning på seminaropppgaver til uke 8

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

UNIVERSITETET I OSLO

Velkommen til. INF våren 2016

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Kapittel 9: Sortering og søking Kort versjon

Forelesning inf Java 4

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

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

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

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

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

UNIVERSITETET I OSLO

Dagens tema Kapittel 8: Objekter og klasser

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

Sortering med tråder - Quicksort

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

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

UNIVERSITETET I OSLO

INF1010 siste begreper før oblig 2

UNIVERSITETET I OSLO

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

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Transkript:

INF1010 våren 2014 Onsdag 22. januar Grensesnitt 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 (innkludert Rett på Java ). Derfor er det kanskje lurt å vente med å lese andre kilder til du har lært om subklasser (i februar). 2

Hva er objektorientert programmering? Hva er et objekts grensesnitt mot omverdenen? Svar: De public metodene. F.eks: 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. 3

Hva er objektorientert programmering? n 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 Dette kaller vi metodenes signatur Dette kaller vi metodenes semantikk 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. Dette med semantikk har du kanskje ikke hørt om før! 4

Hva er objektorientert programmering? public -metoder definerer objektets grensesnitt mot omverdene Men dette vet vi jo allerede (?) Ja, men det finnes også noe annet som kan gi enda mer vekt på et objekts grensesnitt 5

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 6

public void settinn(int tall) interface Heltallsbeholder { public void settinn(int tall); public int taut( ); 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 { < (privat) Java datastruktur > public void settinn(int tall) { < Java kode > public int taut( ) { < Java kode > new MinHeltallsbeholder() gir dette objektet: public void settinn(int tall) public int taut( ) kode kode datastruktur Objekt av klassen MinHeltallsbeholder Nytt Java nøkkelord: implements! 7

public void settinn(int tall) interface Heltallsbeholder { public void settinn(int tall); public int taut( ); 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 8

public void settinn(int tall) interface Heltallsbeholder { public void settinn(int tall); public int taut( ); 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 9

interface Heltallsbeholder { public void settinn(int tall); public int taut( ); 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! MEN:! Bare du, som er et menneske, kan sjekke at implementasjonen overholder de SEMANTISKE KRAVENE! til metodene.! 10

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 sematiske 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) 11

Med Javadoc /** Objektene av alle klassene som implementerer dette gresesnittet tar vare * på heltall. * * @author Stein Gjessing * versjon 10. februar 2012 */ 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 12

13

class Kanin{ String navn; Kanin(String nv) {navn = nv; Kaniner og kaninbur 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; 14

Kalle Class LittTestKaninbur { public static void main (String [ ] args) { KaninOppbevaring detguleburet = new Kaninbur( ); Kanin kalle = new Kanin("Kalle"); Kanin sprett = new Kanin( Sprett ); detguleburet.settinn(kalle); booelan settinnok = detguleburet.settinn(sprett); if (settinnok) { System.out.prinln( Feil 1 ); else {System.out.prinln( Riktig 1 ); Kanin enkanin = detguleburet.taut( ); if (enkanin.navn.equals( Kalle ) { System.out.prinln( Riktig 2 ); else {System.out.prinln( Feil 2 ); detguleburet.settinn(sprett); KaninOppbevaring detstoreburet; detstoreburet = new Kaninbur(); Kanin trofast = new Kanin("Pelle"); detstoreburet.settinn(trofast); // bytt kaninene i de to burene: Kanin forstut = detguleburet.taut( ); Kanin utavstore = detstoreburet.taut( ); detstoreburet.settinn(forstut); detguleburet.settinn(utavstore);... Ins$tu' for informa$kk Sprett Pelle 15

Felles: class Kanin og interface KaninOppbevaring public static void main (... ) { KaninOppbevaring detguleburet = new Kaninbur( ); Type: KaninOppbevaring Navn: detguleburet Kanin kalle = new Kanin("Kalle"); Type: Kanin Navn: kalle detguleburet.settinn(kalle); class Kaninbur implements KaninOppbevaring {... Ins$tu' for informa$kk Type: Kanin Navn: denne...... boolean settinn (Kanin den) Kanin taut( ) Objekt av klassen Kanin Objekt av klassen Kaninbur implements KaninOppbevaring KaninOppbevaring detstoreburet; detstoreburet = new Kaninbur(); Type: KaninOppbevaring Type: Kanin Navn: detstoreburet Navn: denne Kanin trofast = new Kanin("Pelle"); Type: Kanin Navn: trofast detstoreburet.settinn(trofast);.... detstoreburet.taut( );... Objekt av klassen Kanin...... Kanin taut( ) Objekt av klassen Kaninbur implements KaninOppbevaring 16

Signaturer: public boolean settinn(kanin den) public Kanin taut( ) En tankemodel for gresesnittet KaninOppbevaring 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.. Et grensesnitt beskriver en rolle som alle objektene som implementerer dette grensesnittet må kunne spille" public boolean settinn(kanin den) 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)" 17

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) { 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( ); 18

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

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; 20

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; KanBjeffe rollen Utkledd rollen Objekt av klassen Karnevalshund Vi ser på objektet med tre forskjellige briller rolle = brille 21

Et eksempel til: 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 forskjellig type. Hvilke roller kan dette objektet spille? Hva ser vi ved hjelp av de forskjellige pekerene? 22

Forskjellig klasser samme grensesnitt 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; 23

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) 24

Forrige uke: class GeneriskBeholderTilEn <T> { T denne; public void settinn (T en) { denne = en; public T taut ( ) {return denne; Generisk grensesnitt Nå: interface Beholder <T> { public void settinn (T en); public T taut ( ); class GeneriskBeholderTilEn <T> implements Beholder <T> { T denne; public void settinn (T en) { denne = en; public T taut ( ) {return denne; 25

Mer grensesnitt med parametre (Generiske grensesnitt) interface EnkelStorBeholder <E> { public void settinn (E den); 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? Sammenlign med HashMap. 26

class KonkretEnkelStorBeholder <E> implements EnkelStorBeholder<E> { private E [ ] alle = (E [ ] ) new Object [100]; private int antall = 0; public boolean settinn(e det) { if (antall ==100) return false; navn: alle alle[antall] = det; type: E[] antall ++; return true; navn: antall public E finnen( ) { 7 type: int if(antall == 0) return null; return alle[antall-1]; settinn public void fjern( ) { finnen if(antall!= 0) antall -- ; fjern Oppgave: Beskriv sematikken til metodene / til klassen Slike objekter finnes ikke (må gi E en verdi først) 27

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 1 ); else System.out.println( Feil 1 ); KarnevalsHund trofast = new KarnevalsHund(5); mittstorehundehus.settinn(trofast); KarnevalsHund sjuklingen = mittstorehundehus.finnen( ); mittstorehundehus.fjern( );.... Oppgave: Lag et kaninbur med plass til 100 kaniner navn: alle type: KarnevalsHund[] navn: antall 3 type: int settinn(karnevalshund det) KarnevalsHund finnen( ) void fjern( ) fido passopp trofast 28