Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Relevanta dokument
Generiska datatyper. Parametrisk Polymorfism: Generics. Generisk lista. Utvikning: Typer

Föreläsning 2. Länkad lista och iterator

Föreläsning 2. Länkad lista och iterator

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Konstruktion av klasser med klasser

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

List.java. List.java. Printed by Tom Smedsaas

Föreläsning 4 Innehåll

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Generisk klass med typparameter Inre klass - ListIterator

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Länkade strukturer, parametriserade typer och undantag

Klasshierarkier - repetition

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Tentamen Programmering fortsättningskurs DIT950

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen, EDAA20/EDA501 Programmering

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 2 Datastrukturer (DAT037)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Länkade strukturer. (del 2)

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Laboration 13, Arrayer och objekt

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Objektorienterad Programmering (TDDC77)

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

DAT043 Objektorienterad Programmering

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag till exempeltenta 2

DAT043 - Föreläsning 7

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Repetition av OOP- och Javabegrepp

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Repetition av OOP- och Javabegrepp

Föreläsning 3. Stack

Föreläsning 8: Exempel och problemlösning

OOP Objekt-orienterad programmering

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

1 Comparator & Comparable

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Föreläsning 9 Innehåll

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Lösningsförslag till exempeltenta 1

Laboration A Objektsamlingar

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Programmering för språkteknologer II, HT2011. Rum

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

TENTAMEN I DATAVETENSKAP

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

TENTAMEN OOP

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Objektorienterad programmering med Java, Generics

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Samlingar Collection classes

Polymorfi. Objektorienterad och komponentbaserad programmering

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Föreläsning 3 Datastrukturer (DAT037)

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Tentamen. DD2385 Programutvecklingsteknik vt 2011 Tisdagen den 24 maj 2011 kl Hjälpmedel: penna, suddgummi, linjal

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Programmering för språkteknologer II, HT2014. Rum

Transkript:

Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

interface, motivation och bakgrund Antag att vi gör en generell listklass: public class List { protected static class ListNode { public Object data; public ListNode next; public ListNode() { next = null; public ListNode(Object data, ListNode node) { this.data = data; this.next = node;

interface, motivation och bakgrund Forts interface protected ListNode head; public List() { head = null; public void prepend(object element) { ListNode _ = new ListNode(element,head); head = _; public void print() { for (ListNode _ = head; _!= null; _ = _.next) { _.data.print(); // end of class List

interface, motivation och bakgrund Forts interface Som synes förutsätter klassen List att objekten har en print-metod. Antag att vi försöker lägga in följande objekt av följande typ public class Book { String author, title; public Book(String author, String title) { this.author = author; this.title = title; public void print() { System.out.println( author + " : " + title); public String getauthor() { return author; public String gettitle() { return title;

interface, motivation och bakgrund Forts interface Med följande testklass: public class BookList { public static void main(string [] arg) { List l = new List(); l.add(new Book("Chaucer, Geoffrey", "Canterbury tales")); l.add(new Book("Adams, Douglas", "The Hitchhiker s Guide")); l.add(new Book("Falstaff, Fakir", "Ett svårskött pastorat")); l.print();

interface, motivation och bakgrund Forts interface Men, när vi kompilerar: bellatrix$ javac BookList.java List.java:36: cannot resolve symbol symbol : method print () location: class java.lang.object _.data.print(); ˆ 1 error bellatrix$ Varför? De lagrade objekten har ju en print-metod!

interface, motivation och bakgrund Forts interface List vet inget om de av objekt som skall lagras. Hur kan vi informera L om att objekten kommer att ha en print-metod? Möjliga lösningar: Definiera en basklass med en print-metod och sedan kräva att användaren alltid gör subklasser till denna. Blir dock besvärligt i längden eftersom Java inte tillåter s.k. multipelt implementationsarv. I just detta speciella exempel skulle print-metoden i klassen List anropa _.data.tostring() i stället eftersom alla objekt har en sådan metod. Ingen generell lösning på problemet. Använda ett interface.

Definition av interface Forts interface Ett interface är att betrakta ungefär som en abstrakt klass utan instansvariabler där alla metoder är abstrakta. På svenska använder man ordet gränssnitt (eller interfejs) Exempel: public interface Printable { public void print(); En interfacedeklaration får bara innehålla oimplementerade (abstrakta) metoder. Konstanta klassvariabler (static final) får deklareras. Man behöver inte deklarera vare sig interfacet eller metoder med ordet abstract de är alltid abstrakta i ett interface.

Användning av interface Användning av interface Man kan låta en klass implementera ett gränssnitt vilket betyder att klassen definierar de metoder gränssnittet anger. Exempel: public class Book implements Printable { String author, title; public Book(String author, String title) { this.author = author; this.title = title; public void print() { System.out.println( author + " : " + title ); public String getauthor() { return author; public String gettitle() { return title;

Användning av interface Användning av interface Man kan använda gränssnitt som deklarationer av objekt-referenser. Således skulle man t ex i klassen Book skriva: public static void main(string [] args) { Printable p = new Book("a", "b"); Book b = new Book("x", "y"); p = b; b = p; b = (Book) p; // OK // *** Fel! Måste skrivas: Object o = b; p.print(); // OK b.print(); // OK o.print(); // *** Fel! Måste skrivas: ((Printable) o).print(); String t = p.gettitle(); // *** Fel! String u = b.gettitle(); // OK

Användning av interface Användning i klassen List Man skulle kunna ändra så att man lagrar Printable i stället för Object i ListNode och add men bättre (i detta fall) att bara typkasta där man behöver det: public void print() { for (ListNode list = head; list!= null; list = list.next) ((Printable)list.data).print(); På så sätt kräver man Printable endast om man tänker använda metoden print på listan.

Användning av interface En sorterad lista Ibland kan det vara eftersträvansvärt att de objekt som läggs in i listan har en ordningsrelation. Detta kan realiseras genom att objekten implementerar gränssnittet Comparable som finns definierat i java.lang: public interface Comparable { public int compareto(object o); Om a och b är refererar objekt från klasser som implementerar Comparable så skall uttrycket a.compareto(b) returnera ett negativt värde om man anser att a < b, ett positivt värde om a > b och 0 om a = b. Klassen String implementerar detta gränssnitt.

Användning av interface Sorterad lista forts Klassen byggs på klassen List: public class SortedList extends List { public void add(object o) { head = add(o, head); protected static ListNode add(object o, ListNode l) { if (l==null) { return new ListNode(o, null); else { Comparable newobject = (Comparable) o; Comparable currentobject = (Comparable) l.data; if (newobject.compareto(currentobject) < 0) { return new ListNode(o, l); else { l.next = add(o, l.next); return l;

Användning av interface Sorterad lista forts public class Book implements Printable, Comparable { private String author, title; public Book(String a, String t) { author = a; title = t; public void print() { System.out.println( author + " : " + title); public int compareto(object o) { Book b = (Book) o; return author.compareto(b.author);

Användning av interface Sorterad lista forts public class BookList { public static void main(string [] arg) { List l = new SortedList(); l.add(new Book("Chaucer, Geoffrey", "Canterbury tales")); l.add(new Book("Adams, Douglas", "The Hitchhiker s Guide")); l.add(new Book("Falstaff, Fakir", "Ett svårskött pastorat")); l.print(); bellatrix$ java BookList Adams, Douglas : The Hitchhiker s Guide Chaucer, Geoffrey : Canterbury tales Falstaff, Fakir : Ett svårskött pastorat bellatrix$

Standardinterfacet Iterator Iteratorer En iterator är en mekanism med vars hjälp man utifrån kan gå igenom de enskilda objekten i en samling som t.ex. en lista, en hashtabell eller ett binärt sökträd. Detta skall kunna göras utan kunskap om den interna representationen. Med en iterator skulle man t ex kunna printa ut elementen i listan i föregående exempel listexempel utan att använda metoden print() List l = new List();... Iterator li = l.iterator(); while (li.hasnext()) { System.out.println(li.next());

Standardinterfacet Iterator Iteratorer forts Komplettera klassen List med till exempel en inre klass som implementerar Iterator-interfacet: public class ListIterator implements Iterator { protected ListNode current = head; public boolean hasnext() { return current!= null; public Object next() { Object thedata = current.data; current = current.next; return thedata; public void remove() { public ListIterator iterator() { return new ListIterator(); (Klassen behöver naturligtvis inte vara en inre klass.)

Standardinterfacet Iterator Iterator forts Iterator är ett interface som finns deklarerat i java.util.iterator som alltså måste importeras. t deklarerar de tre metoder som definierades i klassen ListIterator ovan. Alla klasser som implementerar Iterator-interfacet kan sedan itereras över på samma sätt (generisk kod). Iterator iter = list.iterator(); while (iter.hasnext() ) { System.out.println(iter.next()); for (Object data : list) { System.out.println(data); Observera att for-loppen ovan ser annorlunda ut. Resultatet är stabilare kod, även än den i while-loopen varför?

Sammanfattning Sammanfattning Ett interface är ett kontrakt: om I deklarerar metodsignaturen m och C (D) implementerar I måste m finnas i C (D) Klientkod kan då skrivas mot I som fungerar oavsett om objektet är C eller D under körning Eftersom interface kan implementeras av olika klasshierarkier är interface ett utmärkt sätt att separera olika klasser från varandra är ett sätt att ge Java många av de fördelar som multipelt arv ger (främst generell typsäker kod), utan nackdelarna Nackdelar med multipelt implementationsarv komplext (vad händer om A ärver B flera gånger, två superklasser som båda definierar m, etc.) svårt att implementera effektivt Ex. på språk med multipelt implementationsarv: C++, Python, Eiffel Många standardinterface i Javas klassbibliotek, även s.k. marker interfaces som är tomma