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. Tillåtna hjälpmedel: Inga. Kurskod D0010E Datum 2010-03-19 Skrivtid 5 tim 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).
Adam Maria Anna Carl John Pia Stina Bill Emma 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 unika 1. 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 anna = new Person("Anna"); Person john = new Person("John"); Person maria = new Person("Maria", anna, john); Person carl = new Person("Carl", anna, john); Person adam = new Person("Adam"); Person emma = new Person("Emma", maria, adam); Person stina = new Person("Stina"); Person pia = new Person("Pia", john, stina); Person bill = new Person("Bill"); Person thomas = new 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 State running : boolean + setactive(boolean b) : void <<abstract>> Event # time : double #duration : double - id ; int + Event(double time, double duration, int id) + <<abstract>> execute(state s) : void + tostring() : String 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 simulator 2. 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) 5. Begränsning: Du får inte använda instanceof för att t ex ta reda på vilken typ en viss händelse har. Implementera klassen 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 är arrayer. 2 Inte nödvändigtvis den i laboration 5.
Package Class Use Tree Deprecated Index Help equals, getclass, hashcode, notify, notifyall, wait, wait, wait PREV CLASS NEXT CLASS FRAMES NO FRAMES SUMMARY: NESTED FIELD CONSTR METHOD DETAIL: FIELD CONSTR METHOD Constructor Detail d0010e100319 Class java.lang.object d0010e100319. public () Creates an empty vector with length zero. public class 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 acts as an array that automatically grows and shrinks in length as needed. 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. Constructor Summary () Creates an empty vector with length zero. Method Summary void add(java.lang.object item) Adds an element to the vector at its end. 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. 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) Substitutes an element for another. int size() Returns the current length of the vector. java.lang.string tostring() Returns a string representation of the object. size public int size() 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. elementat public java.lang.object elementat(int i) add Returns an element currently stored in the vector. i - the index of the element. Returns: the element at index i. java.lang.arrayindexoutofboundsexception - if i is not a valid index. public void add(java.lang.object item) 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. item - the item that should be added to the vector. Methods inherited from class java.lang.object Sida 1 av 4 Sida 2 av 4
remove public void remove(int index) 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. index - the index of the element that should be removed. java.lang.arrayindexoutofboundsexception - if i is not a valid index. tostring in class java.lang.object See Also: Object.toString() Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES NO FRAMES SUMMARY: NESTED FIELD CONSTR METHOD 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. item - the inserted element. index - the index at which the element should be placed. 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. item - the item that should replace the element currently in the vector. index - the index at which the substitution should be made. java.lang.arrayindexoutofboundsexception - if index is not a valid index. tostring public java.lang.string tostring() Returns a string representation of the object. Overrides: Sida 3 av 4 Sida 4 av 4