Gender-klassen (vedlegg 1) representerer kjønnet til en person, i denne oppgaven begrenset til mann og kvinne. Klassen skal kodes slik at det ikke skal være mulig å ha andre Gender-objekter enn disse to kjønnene. En Gender-instans har et forklarende ord/navn knyttet til seg, som settes når instansen lages, og som ikke skal være direkte tilgjengelig fra andre klasser. Oppgave a)Hvilke modifikatorer bør stå foran deklarasjonen av label-feltet og konstruktøren? Begrunn svaret.
Oppgave b)Hvordan er klassen kodet så det forklarende ordet/navnet vises ved utskrift, f.eks. med System.out.println(...)?
Oppgave c)Fullfør valueOf-metoden.
Person-klassen (vedlegg 1) representerer en person, med et navn (String) og et kjønn (Gender). Navnet settes kun ved opprettelsen, mens kjønnet kan settes når som helst. For å håndtere familieforhold så har et Person-objekt data om mor, far og barn. addChild-metoden brukes for å knytte et barn til en forelder, og det er ikke spesifisert andre metoder som endrer barn-forelder-koblingen. addChild både registrerer barnet og setter barnets kobling til mor eller far, avhengig av kjønnet til forelderen. Ta f.eks. kallet chris.addChild(pat), hvor pat blir registert som barnet til chris. Hvis chris er mann, så blir han registrert som pat sin far, mens hvis chris er kvinne, så blir hun registrert som pat sin mor. Oppgave d)Skriv felt, metoder og konstruktør for innkapsling av navn, kjønn, mor, og far. Bruk name, gender, mother og father som grunnlag for navngiving.
Oppgave e)Implementer getChildCount, hasChild og getChildren, med nødvendig(e) felt.
Oppgave f)Som en del av innkapslingen av barn-koblingen, så har vi valgt å la Person implementere Iterable<Person>-grensesnittet. Hva betyr dette for koden en kan skrive for å gå gjennom barna til en Person? Implementer metoden(e) som er påkrevd av dette grensesnittet.
Oppgave g)Implementer addChild-metoden, basert på kravene beskrevet over og i vedlegg 1, og kravene som implisitt testes av testAddChild i PersonTest-klassen (vedlegg 1).
Oppgave h) Nederst i testmetoden testAddChild er to linjer marker med // ??? Hvilke tilfeller eller problemer er det som kan testes på de to punktene i koden? Hvordan oppfører din kode seg, og hva mener du er riktig oppførsel i de to tilfellene? (Du trenger ikke rette på koden din)
|
Family-klassen (vedlegg 1) holder rede på personer i en familie, med metoder for å legge til familiemedlemmer (Person-objekter), slå opp personer på navn, lagre familiemedlemmene og lese dem inn igjen. Oppgave a)Skriv metodene addMember og findMember (og definer nødvendige felt), som henholdsvis legger en Person til som familiemedlem og finner et familiemedlem med et angitt navn.
I vedlegg 2 beskrives et tekstformat for data om personene i en familie, inkludert foreldre-barn-koblingene. Oppgave b)I vedlegg 1 er det med en hjelpemetode tokenize, som kan være nyttig ved innlesing og som kan antas ferdig implementert. Hvilke(n) modifikator(er) burde den ha? Begrunn svaret!
Oppgave c)Skriv metodene save og load, som støtter dette tekstformatet. Begrunn hvordan du velger å behandle problemet med unntak.
Oppgave d)Tegn objektdiagram for objektstrukturen som er resultatet av å lese inn eksempelteksten i vedlegg 2 med load-metoden til et nyopprettet Family-objekt. Hvilke av objektene fantes fra før og hvilke er blitt opprettet av load-metoden?
|
Denne deloppgaven handler om familierelasjoner, som forelder/far/mor, søsken/søster/bror, onkel/tante, søskenbarn/kusine/fetter, niese/nevø osv. Sister-klassen skal implementere Relation-grensesnittet (vedlegg 1), slik at metoden getRelativesOf returnerer alle søstrene til Person-argumentet. new Sister().getRelativesOf(person) skal altså returnere alle søstrene til person. Tilsvarende skal klassen Parent implementere Relation slik at metoden getRelativesOf returnerer alle foreldrene, altså mor og/eller far, til Person-argumentet. Merk at Sister- og Parent-klassene ikke står i noe vedlegg. Oppgave a)Implementer Sister- og Parent-klassene.
Tante-relasjonen kan defineres som søster av forelder, altså en kombinasjonen av Sister- og Parent-logikken. For å slippe å måtte lage nye klasser for slike sammensatte relasjoner, så defineres Relation2-klassen. Den inneholder to Relation-objekter rel1 og rel2 og implementerer Relation slik at metoden getRelativesOf returnerer alle som er rel2-relatert til de som er rel1-relatert til Person-argumentet. Hvis Relation2-klassen instansieres med new Relation2(new Parent(), new Sister()), så vil den i praksis implementere tante-relasjonen ved først å finne foreldrene vha. Parent-objektet og så finne foreldrenes søstre vha. Sister-objektet. Oppgave b)Implementer Relation2-klassen. Hva slags standardteknikk er det som brukes her og hva karakteriserer den?
Oppgave c)Forklar hvordan Relation2-klassen kan brukes til å rigge opp et objekt som implementerer oldeforelder-relasjonen, altså tre foreldre-nivåer unna.
|
Oppgave a)Hvis en lager Relation-implementasjoner for søsken, søster og bror, så vil en finne at de er nesten like. En søster er jo en kvinnelig søsken, mens en bror er en mannlig søsken. Forklar med tekst og kode hvordan en kan lage en Sibling-klasse som implementerer søsken-relasjonen, med subklassene Sister og Brother for hhv. søster- og bror-relasjonen.
Oppgave b)Hva er en abstrakt klasse? Burde noen av Sibling-, Sister- eller Brother-klassene være abstrakt? Begrunn svaret!
Oppgave c)Funksjonelle grensesnitt er grensesnitt med noen spesifikke egenskaper, og Relation er et slikt grensesnitt. Forklar hvorfor!
Oppgave d)Fullfør deklarasjon under slik at daughter-variablen implementerer datter-relasjonen. daughter.getRelativesOf(person) skal altså returnere døtrene til person. Relation daughter = ... bruk Java 8-syntaks her ...
|
|
The format is line-based, with three kinds of lines:
Lines of all types can be mixed, but there should be no forward references from lines of type 2 to lines of type 1. I.e. the names in lines of type 2 have previously occurred in lines of type 1. Below are two examples of the format. Example 1:
Example 2:
|