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. Expand |
---|
| Parent-klassen er enklest. En må få med både mor og far, og unngå å legge til null-verdier. I Sister-klassen er det laget en hjelpemetode kalt addChildren, som legger alle jente-barn av en gitt Person til en liste og unngår duplikater. Denne kalles med både mor og far til personen en ønsker å finne søstrene til. Merk at dette også vil legge til halvsøstre. Til slutt fjernes personen selv, for hun er jo ikke sin egen søster (subtilt poeng, jeg vet)! Code Block |
---|
public class Sister implements Relation {
private void addChildren(Person person, Collection<Person> result) {
if (person != null) {
for (Person child : person) {
if (child.getGender() == Gender.FEMALE && (! result.contains(child))) {
result.add(child);
}
}
}
}
@Override
public Collection<Person> getRelativesOf(Person person) {
Collection<Person> result = new ArrayList<>();
addChildren(person.getFather(), result);
addChildren(person.getMother(), result);
result.remove(person);
return result;
}
}
public class Parent implements Relation {
@Override
public Collection<Person> getRelativesOf(Person person) {
Collection<Person> result = new ArrayList<>();
if (person.getMother() != null) {
result.add(person.getMother());
}
if (person.getFather() != null) {
result.add(person.getFather());
}
return result;
}
} |
|
Oppgave b)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? Expand |
---|
| Poenget her er å gjøre som beskrevet i oppgaven, å bruke rel2 på resultatet av å bruke rel1. Her sjekkes det ikke for duplikater (som det sjelden er behov for med relasjoner av denne typen). Dette er delegeringsteknikken i praksis, som kjennetegnes ved at et delegerende objekt, som skal utføre en oppgave, ber en eller flere delegater om å utføre (omtrent) samme oppgave, for så å kombinere resultatene. Her delegeres det til rel1 og rel2, som implementerer samme grensesnitt som Relation2. Det er også en form for komposisjon, men det er ikke pensum. Code Block |
---|
public class Relation2 implements Relation {
public Relation2(Relation rel1, Relation rel2) {
this.rel1 = rel1;
this.rel2 = rel2;
}
private final Relation rel1, rel2;
@Override
public Collection<Person> getRelativesOf(Person person) {
Collection<Person> result1 = rel1.getRelativesOf(person);
Collection<Person> result2 = new ArrayList<>();
for (Person person1 : result1) {
result2.addAll(rel2.getRelativesOf(person1));
}
return result2;
}
} |
|
Oppgave c)Forklar hvordan Relation2-klassen kan brukes til å rigge opp et objekt som implementerer oldeforelder-relasjonen, altså tre foreldre-nivåer unna. Expand |
---|
| Oldeforelder-relasjonen kan defineres som forelder av forelder av forelder. Dette kan realiseres vha. to (nivåer av) Relation2-objekter (altså uten å skrive en ny klasse!): Code Block |
---|
Relation parent = new Parent();
Relation grandParent = new Relation2(parent, parent);
Relation grandGrandParent = new Relation2(grandParent, parent); |
|
|