Eksamen Objektorientert Programmering 2011 Høgskolen i Østfold 2011-05-11 Emnekode ITF10611 Emne Objektorientert Programmering Dato 2011 05-11 Eksamenstid 09:00-13:00 Hjelpemidler To A4-ark (fire sider) med egne notater. Faglærer Harald Holone Eksamensoppgaven Oppgavesettet består av 18 sider inklusive denne forsiden, og er delt inn i to hovedoppgaver med henholdsvis 4 og 3 deloppgaver. For hver oppgave er det angitt hvor stor vekt den blir tillagt i vurderingen av besvarelsen. Den endelige karakteren blir satt på bakgrunn av denne vektleggingen kombinert med en helhetlig vurdering av besvarelsen. Du er selv ansvarlig for å kontrollere at oppgavesettet er komplett. Les gjennom alle oppgavene før du begynner å løse dem. Husk å bruke kommentarer i den koden du skriver. Dette kan ha stor uttelling dersom selve koden er feil, men det du har tenkt er riktig. Det lønner seg å besvare alle oppgavene. Det er bedre å skrive litt på hver oppgave enn å besvare noen deloppgaver blankt. God sommer, og takk for laget i vårsemesteret! 1
1 Begreper og prinsipper (40%) [35!] Disse oppgavene skal besvares kort og presist. Du skal altså ikke skrive mer enn nødvendig, men pass på å besvare alt oppgaven spør etter. Det deles ikke ut ro-poeng i disse oppgavene. Det er viktig at du forklarer med dine egne ord, og at du ikke leverer avskrift fra andre kilder. 1.1 Klasser og objekter (5%) Hva er en klasse, og hva er et objekt? Forklar sammenhengen mellom en klasse og et objekt, og gi et eksempel på hvordan man lager en instans av klassen Integer. Hva er arv, og hvorfor er det så sentralt i OOP? 1.2 Primitive datatyper (5%) I Java finnes noe som heter primitive datatyper. Forklar hva dette er, og hvordan de forholder seg til klasser. 1.3 Abstraksjon og innkapsling (15%) a) Hva mener vi med abstraksjon og innkapsling? Hvilke mekanismer finnes i språket Java for å oppnå dette? Hva er et Interface, og hvilken rolle spiller det i forbindelse med abstraksjon? Gi et eksempel på et Interface (bruk et du kjenner fra før, eller lag ditt eget) og vis hvordan det kan benyttes. b) Hva er en abstrakt klasse, og hva er en abstrakt metode? Gi et eksempel på en abstrakt klasse med en abstrakt metode. Forklar hvorfor denne klassen må være abstrakt. 1.4 Polymorfisme (10%) Hva er polymorfisme, og hva har det med arv å gjøre? Hva er overriding av metoder? Gi et eksempel på dette. 2 Utviklingsoppgave (60%) [65!] I denne oppgaven skal det utvikles en skisse til et objektorientert system for håndtering av epostlignende meldinger. En 2
melding består av tittel, tekst, dato, avsender og mottaker. Det er kun én mottaker pr. melding. På meldingsserveren finnes det tre meldingsbokser for hver bruker: INBOX, SENT og AR- CHIVE. En melding leveres til en meldingsserver, som legger meldingen i en meldingsboks av typen INBOX som tilhører mottakeren. Samtidig legges meldingen i avsenderens meldingsboks av typen SENT. For at en melding skal sendes må både avsender og mottaker være registrert hos meldingsserveren ved hjelp av adduser(user user). Meldingene for en person hentes også fra en meldingsserver, og meldingene hentes fra personens INBOX dersom ikke noe annet er angitt. Det finnes også en ARCHIVE meldingsboks for hver bruker. En melding arkiveres ved å gi beskjed til meldingsserveren. Dette medfører at meldingen flyttes fra INBOX til ARCHIVE for den brukeren. Meldingene i en meldingsboks kan sorteres på forskjellig vis. 2.1 Modell (15%) a) Under følger Java-kode for interfaces som skal benyttes for å løse oppgaven. Du skal tegne et UML-diagram som viser relasjonen mellom disse interfacene. Beskriv med dine egne ord relasjonene mellom interfacene. Dette skal gjøres enkelt. Det er kombinasjonen av tegningen og beskrivelsen som blir vurdert, ikke detaljene i UML-tegningen. public interface User { String getname(); public interface Message { User getsender(); 3
User getreceiver(); String getsubject(); String getbody(); Date getdate(); public interface MessageBox { static final int SORT_BY_SENDER = 0; static final int SORT_BY_DATE = 1; static final int SORT_REVERSE = 2; static final int TYPE_INBOX = 0; static final int TYPE_ARCHIVE = 1; static final int TYPE_SENT = 2; int gettype(); void sort(int sortmode); void addmessage(message message); boolean removemessage(message message); List<Message> getmessages(); public interface MessageServer { boolean adduser(user user); // Returns false on failure boolean sendmessage(message message); // Returns false on failure List<Message> getmessages(user user); List<Message> getmessages(user user, int boxtype); boolean archive(message message); b) Forklar med dine egne ord hva som er fordeler og evt. ulemper med å diskutere modellen ved hjelp av interfaces før man starter på implementasjonen. 4
2.2 Implementasjon (35%) a) Du skal lage klassen DefaultMessage som implementerer Message. Denne klassen skal ha en konstruktør som tar alle relevante parametere. Du skal altså ikke lage set-metoder for de medlemsvariablene du velger. Klassen skal også override metoden tostring() for enlinjesvisning av en melding. Tips: Klassen Date har en default konstruktør som lager en instans som representerer tid og dato nå, slik: Date d = new Date(); b) Under finner du en halvveis ferdig implementasjon av en MessageServer. Først skal du beskrive med dine egne ord de delene av klassen som allerede er implementert. Så skal du gjøre ferdig klassen, dvs du skal implementere alle metodene som inneholder en kommentar som sier at de er en del av oppgaven. import java.util.hashmap; import java.util.list; import java.util.map; public class DefaultMessageServer implements MessageServer { private Map<User, MessageBox> inboxes; private Map<User, MessageBox> sentboxes; private Map<User, MessageBox> archiveboxes; public DefaultMessageServer() { this.inboxes = new HashMap<User, MessageBox>(); this.sentboxes = new HashMap<User, MessageBox>(); this.archiveboxes = new HashMap<User, MessageBox>(); public boolean adduser(user user) { if(!inboxes.containskey(user)) { inboxes.put(user, 5
new DefaultMessageBox(MessageBox.TYPE_INBOX)); sentboxes.put(user, new DefaultMessageBox(MessageBox.TYPE_SENT)); archiveboxes.put(user, new DefaultMessageBox(MessageBox.TYPE_ARCHIVE)); return true; return false; public boolean archive(message message) { public List<Message> getmessages(user user) { public List<Message> getmessages(user user, int boxtype) { public boolean sendmessage(message message) { Tips: Dokumentasjon av Map-interfacet er vedlagt. 6
2.3 Sortering og I/O (15%) a) Du skal nå sørge for sortering for en meldingsboks. Her er DefaultMessageBox som implementerer MessageBox: import java.util.arraylist; import java.util.list; public class DefaultMessageBox implements MessageBox { private List<Message> messages; private int type; public DefaultMessageBox(int type) { this.type = type; messages = new ArrayList<Message>(); public List<Message> getmessages() { return messages; public int gettype() { return type; public void addmessage(message message) { messages.add(message); public boolean removemessage(message message) { 7
return messages.remove(message); public void sort(int sortmode) { Du skal lage metoden sort(int sortmode) ved hjelp av to forskjellige klasser som implementerer Comparator, én for sortering på dato, en annen for sortering på avsender. Ved sortering på avsender skal meldinger fra samme avsender sorteres i datorekkefølge. Alle tre formene for sortering (dato, avsender, revers) skal implementeres i denne metoden. Tips: Relevant dokumentasjon er vedlagt. b) Beskriv med dine egne ord hvordan du vil gå frem for å lagre innholdet i en meldingsserver (inkludert brukere, meldinger og meldingsbokser) til en fil, og hvordan du ville lese det inn igjen. Slutt på oppgaven. 8