LULEÅ TEKNISKA UNIVERSITET Tentamen i Objektorienterad programmering och design Totala antalet uppgifter: 5 Lärare: Håkan Jonsson, Andrey Kruglyak, 491000 Resultatet offentliggörs senast: 2010-04-09. Kurskod D0010E Datum 2010-03-19 Skrivtid 5 tim Tillåtna hjälpmedel: Inga. OBS! Lösningar får inte baseras på fördefinierade klasser ur t ex Javas standardbibliotek annat än där detta uttryckligen tillåts. 1. Teori a) Vad innebär det att något är deklarerat protected? (1p) b) Låt A, B och C vara tre klasser av vilka B och C ligger i paketet p1 medan A ligger i p2. B ärver A och C ”har en” A. Rita UML-diagrammet som beskriver klasserna och deras relationer till varandra. (1p) c) Denna klass innehåller ett programmeringsfel. Vilket då? (1p) public class Main { public int i = 10; public static int increaseByTen(int i) { return i + this.i; } } d) Denna metod innehåller en annan slags fel. Vilket? (1p) public int factorial(int n) { return n * factorial (n-1); } e) Vad är huvudpoängen med exceptions (”undantag”)? (1p) f) Varför finns det två sorters undantag, checked (Exception) och unchecked (RuntimeException)? Förklara gärna med exempel om du vill. (1p) 2. Observer-Observable mönstret Designmönstret Observer (Observer design pattern på engelska) implementeras i Java med klassen java.util.Observable och gränssnittet java.util.Observer. Implementera två (eller flera) javaklasser där en väsentlig del av funktionen uppnås med hjälp av detta mönster. Du får själv hitta på vad klasserna ska göra. Förklara hur klasserna är tänkta att fungera och hur designmönstret därmed används. (6p) Klassen java.util.Observable innehåller metoderna • public void addObserver(Observer o), • protected void setChanged(), • public void notifyObservers(Object arg) och • public void notifyObservers() medan gränssnittet java.util.Observer endast deklarerar metoden • public void update(Observable o, Object arg). Anna John Stina Adam Bill Maria Emma Carl Pia Thomas Figur 1: Ett släktträd. 3. Släktträd Figur 1 visar ett släktträd där pilarna går från barn till förälder. Man ser t ex att Marias föräldrar är Anna och John, och att Anna är en av Emmas förfäder (hennes mormor). Genom att följa pilarna i ett släktträd kan man hitta en persons alla förfäder. Du får i denna uppgift utgå från att släktträd är naturliga i den meningen att ingen är sin egen förfader/förmoder (alltså inga cykler) och att alla namn är unika1 . a) Deklarera en class Person för en person i ett släktträd. Man ska kunna skapa personobjekt på två sätt; med namn (en sträng) och personens två föräldrar (som är av typen Person) eller med enbart namn, vilket man gör om föräldrarna är okända. (3p) Exempel: Följande kod skapar släktträdet i Figur 1: Person Person Person Person Person Person Person Person Person Person anna john maria carl adam emma stina pia bill thomas = = = = = = = = = = new new new new new new new new new new Person("Anna"); Person("John"); Person("Maria", anna, john); Person("Carl", anna, john); Person("Adam"); Person("Emma", maria, adam); Person("Stina"); Person("Pia", john, stina); Person("Bill"); Person("Thomas", pia, bill); b) Lägg till en dynamisk metod public boolean isAncestor(Person p) som avgör om personen är en förfader/förmoder till p. (3p) En person A är en förfader/förmoder till en person B om, och endast om, A antingen är förälder till B eller en förfader/förmoder till en av B:s föräldrar. Exempel: Stina är förmoder till Thomas (hans mormor) eftersom hon är förälder till Pia som i sin tur är förälder till Thomas. 1 Strängar kan jämföras med equals och, från Java 5.0, även med ==. 4. Dynamic dispatch simulator <<abstract>> Event # time : double #duration : double - id ; int + Event(double time, double duration, int id) + <<abstract>> execute(State s) : void + toString() : String State running : boolean + setActive(boolean b) : void StartEvent + execute(State s) : void StopEvent + execute(State s) : void Figur 2: UML-diagram. a) UML-diagrammet i figur 2 beskriver en del av en generell händelsestyrd simulator2 . Skriv klasserna. (4p) • Event har, förutom två metoder för att utföra en händelse och få en strängrepresentation av den, variabler för en händelses tid, varaktighet och identitetsnummer. Identitetsnumret ska vara unikt och tilldelas automatiskt utan inblandning från eventuella underklasser. Du avgör själv hur toString bör implementeras för att du ska kunna lösa uppgiften. • Metoden setActive i State sätter klassens boolska flagga, som indikerar för simulatorns övriga delar om en simulering ska fortgå eller avbrytas. • Metoden execute ska i underklasserna StartEvent och StopEvent implementeras så att simuleringen markeras för att fortgå respektive avbrytas genom anrop till metoden setActive i State-objektet när de exekveras. Du avgör själv om, och i så fall hur, klasserna ska skugga toString. b) Skapa ytterligare en klass Main i ett annat paket än de i UML-diagrammet med en statisk metod printEvent(Event e) som skriver ut händelsen e:s typ, tid, varaktighet och identitetsnummer med System.out.println. (2p) Begränsning: Du får inte använda instanceof för att t ex ta reda på vilken typ en viss händelse har. 5. SimpleVector Implementera klassen SimpleVector som den beskrivs i bilagan. Om du vill får du göra den generisk men detta krävs inte. Metoden toString() ska rada upp vectorns innehåll i ordning. Du behöver inte skriva någon javadoc. (6p) Observera förbudet mot användning av fördefinierade klasser som t ex java.util.Vector(!) Ett exempel på lämplig intern representation i SimpleVector är arrayer. 2 Inte nödvändigtvis den i laboration 5. SimpleVector 2010-03-13 18.05 2010-03-13 18.05 equals, getClass, hashCode, notify, notifyAll, wait, wait, wait Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD SimpleVector FRAMES NO FRAMES DETAIL: FIELD | CONSTR | METHOD Constructor Detail d0010e100319 SimpleVector Class SimpleVector public SimpleVector() java.lang.Object d0010e100319.SimpleVector Creates an empty vector with length zero. public class SimpleVector extends java.lang.Object Method Detail This class provides vectors that are similar to those provided by the class Vector in the Java standard library but simpler to use. A SimpleVector acts as an array that automatically grows and shrinks in length as needed. size public int size() Elements are indexed 0 to size()-1, i.e. the current size of the vector minus one. By the first element is meant the element at index 0. The element at index size()-1 lies at the end of the vector. Returns the current length of the vector. This is the number of successful add and insert operations performed minus the number of (successful and performed) remove operations. Returns: the current length. Constructor Summary SimpleVector() Creates an empty vector with length zero. elementAt public java.lang.Object elementAt(int i) Method Summary Returns an element currently stored in the vector. void add(java.lang.Object item) Adds an element to the vector at its end. Parameters: i - the index of the element. Returns: the element at index i. Throws: java.lang.Object elementAt(int i) Returns an element currently stored in the vector. void insert(java.lang.Object item, int index) Inserts an element into the vector, which length increases by one. java.lang.ArrayIndexOutOfBoundsException - if i is not a valid index. void remove(int index) Removes an element from the vector and decreases the length of the vector by one. void set(java.lang.Object item, int index) add public void add(java.lang.Object item) Substitutes an element for another. int size() Adds an element to the vector at its end. The length of the vector increases by one and the added element ends up at index size()-1 in this enlarged vector. Returns the current length of the vector. java.lang.String toString() Parameters: item - the item that should be added to the vector. Returns a string representation of the object. Methods inherited from class java.lang.Object file:///Users/hj/Documents/src/d0000test2/doc/index.html Sida 1 av 4 file:///Users/hj/Documents/src/d0000test2/doc/index.html Sida 2 av 4 SimpleVector 2010-03-13 18.05 remove SimpleVector 2010-03-13 18.05 toString in class java.lang.Object See Also: public void remove(int index) Object.toString() Removes an element from the vector and decreases the length of the vector by one. The vector is contracted by shifting all elements at indices higher than that of the removed element one step towards the first element of the vector. Parameters: index - the index of the element that should be removed. Throws: java.lang.ArrayIndexOutOfBoundsException - if i is not a valid index. Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES DETAIL: FIELD | CONSTR | METHOD insert public void insert(java.lang.Object item, int index) Inserts an element into the vector, which length increases by one. The element ends up at index index shifting all other elements that were placed at indices index or higher one step towards the end of the vector. The inserted element ends up before all these. It is valid to insert an element into an empty vector but only at index 0. Parameters: item - the inserted element. index - the index at which the element should be placed. Throws: java.lang.ArrayIndexOutOfBoundsException - if index is not a valid index. set public void set(java.lang.Object item, int index) Substitutes an element for another. Parameters: item - the item that should replace the element currently in the vector. index - the index at which the substitution should be made. Throws: java.lang.ArrayIndexOutOfBoundsException - if index is not a valid index. toString public java.lang.String toString() Returns a string representation of the object. Overrides: file:///Users/hj/Documents/src/d0000test2/doc/index.html Sida 3 av 4 file:///Users/hj/Documents/src/d0000test2/doc/index.html Sida 4 av 4