del 11) A: Proxy B: Strategy C: Facade D: Iterator E: Template Method2) ![]() * vid Wit anger att en Doer kan ha många objekt av Wit. Det syns i koden på att Wit har en ArrayList med Wit-objekt.
3) Mönstret är Observer. Klassen
4a) 1) I XP används testdriven programutveckling. Man testar koden
väldigt väldigt ofta. Vattenfallsmetodiken har en testfas sent
i projektet. 2) XP är en iterativ metodik där kraven kan ändras många gånger
under projektets gång. I Vattenfallsmetodiken planerar man allt från början.
5a) B: RUN REST RUN
6a) Man skriver metoden
6b) Klassen Javakod krävs inte för full poäng på uppgift 6, förutsatt att svaren tydligt beskriver vad som ska gälla. Här kommer ändå kodförslag. class Point implements Comparable<Point> { int x; int y; Point (int ix, int iy) { x = ix; y = iy; } public boolean equals (Point otherP) { return x == otherP.x && y == otherP.y; } public int hashCode() { return // Definiera listig hashkod baserad på x och y } public int compareTo (Point otherP) { return otherP.x - x; // ger < 0 om this kommer först } // ger 0 om lika } // ger > 0 om otherP kommer först 7) Påståendena C, E och F är korrekta.
del 28a) Variabelnspell i klassen Mystery
är en klassvariabel. Det betyder att det finns en enda variabel
spell i klassen, inte en för varje objekt av
Mystery . Varje gång ett objekt av Mystery
skapas sker en ny tilldelning till den gemensamma variabeln spell .
toString() returnerar värdet av den enda variabeln
spell . Om ordet static stryks som modifierare
till spell kommer klassen att fungera som väntat och varje
objekt har ett eget spell-värde.
8b) Om utskrift av m1 görs direkt efter
8c) Satsen
9)
Dynamisk bindning:
I en superklass
Polymorfism: Ojbekt av alla subklasser till
10a) Man använder ett interface som har en enda metod. Metoden
bör ha returtyp interface Filter<E> { public boolean cond (E e); }En filtreringsmetod utan typparameter, som funkar på allt som kan refereras med Object -referenser kan se ut så här:
static void filter(ArrayList alist, Filter fil) { Iterator it = alist.iterator(); while (it.hasNext()) if (fil.cond(it.next())) // Objekt som uppfyller filtreringsvillkoret it.remove(); // tas bort ur listan på säkert sätt } // via iteratornMetoden ovan ändrar den lista som ges som parameter (precis som Collections.sort() gör). Det går förstås att skriva metoden
så att den returnerar den filtrerade listan. Metoden ovan kommer att ge
varningsmedelanden vid kompilering därför att den inte använder typparametrar
fullt ut.Vi har inte tagit upp typparametrisering så mycket i kursen att en fullständigt typparametriserad filtermetod kan förväntas som svar så denna betraktas som överkurs för den som är extra intresserad: filter2
10b)
I det konkreta fallet där element i listan är texter och man filtrerar
på texternas längd så anropas metoden class MyFilter implements Filter<String> { int n; MyFilter(int n) { this.n = n; } public boolean f(String s) { return s.length() < n; } }och anropet som utför filtreringen: filter(alist, new MyFilter(13));Anropet ovan rättades 13 juni. Tidigare antogs att metoden filter returnerar en lista istället för att ändra sin parameter.
11a)
11b) import java.util.*; abstract class Decorator implements IQueue<String> { IQueue<String> myq; Decorator(IQueue<String> q) { myq = q; } public boolean isEmpty() { return myq.isEmpty(); } public void put(String s) { myq.put(s); } public String get() { return myq.get(); } } 11c) import java.util.*; class SizeDeco extends Decorator { private int qsize; SizeDeco (IQueue<String> myQ) { super(myQ); ArrayList<String> helper = new ArrayList<String>(); while (! super.isEmpty()) { helper.add(super.get()); } qsize = helper.size(); for (String s : helper) super.put(s); } public void put(String s) { qsize++; super.put(s); } public String get(){ if (!super.isEmpty()) { qsize--; return super.get(); } return null; } public int size() { return qsize; } } 11d) import java.util.*; class FilterDeco extends Decorator { FilterDeco (IQueue<String> myq) { super(myq); } public void removeAll(){ while (!super.isEmpty()) super.get(); } // Filter antas vara ett interface med en boolean-metod // som anger villkoret för filtreringen public void filter(Filter filter) { ArrayList<String> helper = new ArrayList<String>(); while (! super.isEmpty()) { String s = super.get(); if (filter.cond(s)) // Filter-interfacets metod anropas helper.add(s); // utan att vi vet vilken filtrering } // som är aktuell for (String s:helper) super.put(s); } } |