ExamRequirement-klassen (se vedlegg 3) representerer en sjekk for om et Exam-objekt, altså en avlagt eksamen, tilfredsstiller visse krav. F.eks. kan en lage et ExamRequirement-objekt som sjekker om en har fått minst C i TDT4100. Selve testen gjøres av accepts-metoden, som sjekker det angitte Exam-argumentet mot verdiene som ligger i ExamRequirement-objektet selv. Oppgave a)Skriv ferdig konstruktør nr. 2, og gjør den så kort og enkel som mulig. Oppgave a) Expand |
---|
|
Code Block |
---|
public ExamRequirement(String course, int sinceYear) {
this(course, sinceYear, 'E');
} |
|
Oppgave b) accepts-metoden m/hjelpemetoden acceptsCourse er ferdigskrevet, men koden inneholder (minst) tre feil. Skriv korrekt kode. Expand |
---|
| Sammenligningen må gjøre med emnekode (String) mot emnekode (String), ikke emnekode (String) mot emne (Course), og da må også equals brukes. Testen på årstallet må snus (>= tilsvare ikke mindre enn). Code Block |
---|
private boolean acceptsCourse(Course course) {
return this.course.equals(course.getCode()) && course.getYear() >= sinceYear;
} |
|
Oppgave c) Nederst i klassen er feltet atLeastCInTdt4100 deklarert. Med koden atLeastCInTdt4100.accepts(...) skal en kunne sjekke om en har minst C i TDT4100. Skriv ferdig deklarasjonen, både modifikator(er) og initialiseringsuttrykket. Oppgave d) |
Code Block |
---|
public final static ExamRequirement atLeastCInJava = new ExamRequirement("TDT4100", 0, 'C'); |
|
Oppgave d)Du trenger å sjekke om en eksamen er for et masteremne på IDI, som har kode som begynner på ”TDT42”, f.eks. TDT4250. Forklar hvordan du kan bruke arv for å organisere koden og hvordan eksisterende kode evt. må endres. Expand |
---|
| I acceptsCourse så sammenlignes navn med equals, mens vi trenger å sammenligne med startsWith. En kan lage en protected-metode kalt acceptsCourseCode i ExamRequirement, som kalles av acceptsCourse og som brukes equals. Så redefineres denne metoden i en subklasse, hvor en bruker startsWith. I ExamRequirements: Code Block |
---|
private boolean acceptsCourse(Course course) {
return acceptsCourseCode(course.getCode()) && course.getYear() >= sinceYear;
}
protected boolean acceptsCourseCode(String course) {
return course.equals(this.course);
}
|
I subklassen: Code Block |
---|
@Override
protected boolean acceptsCourseCode(String course) {
return course.startsWith(this.course);
} |
|
Oppgave e)Skriv kode for et funksjonelt grensesnitt IExamRequirement, som ExamRequirement (allerede implisitt) implementerer. Forklar hvorfor et slikt grensesnitt kan være nyttig, fremfor å bare ha ExamRequirement-klassen. Expand |
---|
| Med funksjonelt menes et grensesnitt med bare én metode (og denne metoden gir samme resultat for om den kalles flere ganger på samme exam-objekt). Her er det bare én mulig metode i ExamRequirement som er aktuell som grensesnitt-metoden. Bruk av et slikt grensesnitt gir større frihet i hvilke krav en kan implementere og hvordan det gjøres. Code Block |
---|
public interface IExamRequirement {
public boolean accepts(Exam exam);
} |
|
Oppgave f)Skriv en alternativ deklarasjon av atLeastCInTdt4100 som har IExamRequirement som type og utnytter Java 8 sin funksjonssyntaks i initialiseringsuttrykket. Expand |
---|
|
Code Block |
---|
public static IExamRequirement atLeastCInJave = (exam) -> "TDT4100".equals(exam.getCourse().getCode()) && exam.getGrade() <= 'C'; |
|
|