Interface, exceptions, generik, iteratorer 3 13 Interface, exceptions, generik, iteratorer Tema: Interface, exceptions, generik, introduktion till Java Collection FrameWork, iteratorer. Litteratur: Avsnitt 1.1, 1.5-1.6, 2.1, Appendix A6, A11, A12 (i gamla upplagan: 1.1-1.3, 2.1-2.4, 4.1). Bilderna från föreläsning 1 och 2. Interface U 18. Vad är ett interface och hur ser ett interface ut i stora drag? Vad innebär det att en klass implementerar ett interface? U 19. Beskriv likheter och skillnader mellan ett interface och en abstrakt klass. U 20. a) Antag att följande interface är deklarerat: public interface Resizable { /** * Scales down the object with scaleFactor. * @param scaleFactor the scale factor which is used to reduce the * size of the object */ void downSize(int scaleFactor); } Skalfaktorn är nämnare i det bråk som beskriver skalan (1: skalfaktor). Ju större skalfaktor man har desto mindre blir avbildningen. Exempel: i en skala 1:10000 motsvaras 10000 cm i verkligheten av 1 cm på avbildningen. Klassen Rectangle beskriver en kvadrat. Ändra klassen så att den implementerar interfacet Resizable: public class Rectangle { private double height; private double width; public Rectangle(double h, double w) { height = h; width = w; } ... } b) Avgör för var och en av följande satser om de är korrekta eller ej. Rectangle r = new Rectangle(50, 100); Resizable r = new Resizable(50, 100); Resizable r = new Rectangle(50, 100); Exception U 21. a) Ändra metoden downSize från uppgift U 20 så att exception genereras om parametern scaleFactor har ett värde som är ≤ 0. b) Antag att en variabel r refererar till ett Rectangle-objekt och att en variable n innehåller ett heltal. Anropa downSize och skriv ut en lämplig felutskrift på System.out om exception genereras. Interface, exceptions, generik, iteratorer 14 Implementera en generisk klass U 22. Antag att det i ett klassbibliotek finns det en generisk klass ArrayCollection som representerar en samling element. (Klassen ArrayCollection är en enkel variant av ArrayList.) I implementeringen har man använt en vektor för att representera samlingen enligt följande implementeringsskiss: public class ArrayCollection<E> implements Collection<E> { private E[] theCollection; private int size; /** Constructs an empty list with an initial capacity of ten. */ public ArrayCollection() { theCollection = (E[]) new Object[10]; } /** Appends the specified element to the end of this list. Returns true if this collection changed as a result of the call. */ public boolean add(E x) { if (size == theCollection.length) { doubleArray(); } theCollection[size] = x; size++; return true; } /** Returns true if this collection contains the specified element. */ public boolean contains(Object x) {...} /* Creates an new array that is twice the size of the current array and copies the content of the current array into the new one. */ private void doubleArray() {...} ... } Implementera metoderna contains och doubleArray. U 23. En användare av klassen har implementerat en klass Person enligt följande: public class Person { private String name; ... public boolean equals(Person p) { return name.equals(p.name); } public String toString() { return name; } } Interface, exceptions, generik, iteratorer 15 Följande kod exekveras: ArrayCollection<Person> coll = new ArrayCollection<Person>(); coll.add(new Person("Lisa Svensson")); if (coll.contains(new Person("Lisa Svensson")) ){ System.out.println("Lisa Svensson found"); } else { System.out.println("Lisa Svensson not found"); } Utskriften blir ”Lisa Svensson not found”. Förklara varför. Vad ska vi göra för att Lisa ska hittas? Ledning: • Inuti contains anropas en metod för att jämföra två objekt. Vilken? • Vid kompileringen fastställs signaturen för de metoder som ska anropas. Vilken signatur får ovan nämnda metod? • I vilken klass börjar sökandet efter en metod med denna signatur vid exekveringen? • Finns det någon sådan metod i den klassen? • Finns det någon sådan metod i någon superklass till den klassen? Iterator U 24. I java.util finns interfacen Iterator<E> och Iterable<E>. De har snarlika namn och är därför lätta att blanda ihop. Red ut begreppen genom att diskutera vad de används till och vad de innehåller för metoder. U 25. Klassen ArrayCollection från uppgift U 22 implementerar interfacet Collection<E> som är ett subinterface till interfacet Iterable<E>. Alltså måste klassen ArrayCollection även implementera metoden iterator(). Antag att detta är gjort och att vi har lagt in ett antal personer i samlingen ArrayCollection<Person> coll. a) Skriv programrader som med hjälp av en iterator skriver ut alla personerna i coll. b) Lös samma problem som i deluppgift a men använd en ”foreach”-sats. U 26. Ändra klassen ArrayCollection från uppgift U 22 så att den även implementera metoden iterator(). U 27. Alla interface och klasser som representerar en samling (Collection) i Javas klassbibliotek har en operation iterator() som returnerar ett objekt av en klass som implementerar interfacet Iterator. I interfacet Iterator finns bl.a. metoderna hasNext och next som kan användas för att traversera (iterera över) samlingens element. Varför lägger man inte i stället in metoderna hasNext och next i samlingsklasserna?
© Copyright 2024