Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2007 W
| Ausgabe: | 25.10.2007 |
| reguläre Abgabe: | 08.11.2007, 12:45 Uhr |
| nachträgliche Abgabe: | 19.11.2007, 12:45 Uhr |
public interface Separator {
void print();
// writes several lines to standard output,
// separates previous from following output
}
Ein Aufruf von Separatorbenötigt, die unterschiedliche Varianten der Texttrennung implementieren:
EmptySeparatortrennt Textteile durch mindestens zwei Leerzeilen. In neuen Instanzen von
EmptySeparatorgibt
setLineCountmit einem ganzzahligen Argument (größer oder gleich null) wird die Anzahl zusätzlicher Leerzeilen spezifiziert. Beispielsweise geben Aufrufe von
setLineCount(3)fünf Leerzeilen aus, die beiden immer auszugebenen Leerzeilen und drei durch
setLineCountbestimmte Leerzeilen.
RepeatedSeparatortrennt Textteile durch eine Leerzeile gefolgt von beliebig vielen gleichen Textzeilen, die den Inhalt eines im Konstruktor gesetzten (möglicherweise leeren) Strings enthalten, und einer weiteren Leerzeile. In neuen Instanzen von
RepeatedSeparatorgibt
EmptySeparator) durch Aufrufe von
setLineCountverändert. Beispielsweise geben Aufrufe von
setLineCount(3)je drei Zeilen mit dem im Konstruktor gesetzten Text und einer Leerzeile vor und nach diesem Textblock aus.
LineSeparatortrennt Textteile durch eine Leerzeile gefolgt von einer Zeile, die nur aus Wiederholungen desselben Zeichens besteht, und einer weiteren Leerzeile. Durch eine Methode
setCharmit zwei Argumenten wird das wiederholt auszugebende Zeichen und die Anzahl dieser Zeichen in einer Zeile (mindestens eines) angegeben. Nach Aufruf von
setChar('=',3)gibt
===mit einer Leerzeile davor und danach aus. Der Konstruktor nimmt die gleichen Argumente wie
setCharund ruft damit
setCharauf.
BlockSeparatorähnelt
LineSeparator, jedoch können statt nur einer Zeile mit gleichen Zeichen auch mehrere Zeilen mit gleichen Zeichen ausgegeben werden. Eine neue Instanz von
BlockSeparatorverhält sich genau so wie eine von
LineSeparator. Durch Aufrufe von
setLineCountkann die Anzahl der von
Ein Aufruf von java Test
soll diese Klassen und vor allem
Untertypbeziehungen zwischen entsprechenden Typen (nicht interaktiv) testen.
Berücksichtigen Sie dabei auch die wichtigsten Grenzfälle. Die
Ausgabe des Testprogramms soll auch für jemanden, der das Programm nicht
geschrieben hat, verständlich sein.
Beachten Sie, dass keine Ersetzbarkeit gegeben ist, wenn Zusicherungen einen möglichen Objektzustand beschreiben, in dem die Ersetzbarkeit nicht gilt. Bei der Objekterzeugung selbst (= Aufruf eines Konstruktors) brauchen wir keine Ersetzbarkeit. Es ist also möglich, dass Konstruktoren einer Unterklasse (die einen Untertyp darstellt) nur bestimmte Konstruktoren der Oberklasse mit Einschränkungen auf Argumentwerten aufruft, ohne dadurch die Ersetzbarkeit zu verletzen.
Zwischen der Ausgabe dieser Aufgabenstellung und der regulären Abgabe liegen zwei Wochen. Die erste der beiden Wochen ist noch für Arbeiten an der zweiten Aufgabe vorgesehen. Bitte unterbrechen Sie die Arbeiten an der zweiten Aufgabe nach Allerheiligen und konzentrieren Sie sich ganz auf die Lösung dieser (dritten) Aufgabe.
Stimmt diese Lösung?oder
Ist Y ein Untertyp von X?oder
Wie schaut die richtige Lösung aus?) werden die TutorInnen aber nur ausweichend (mit einem Hinweis auf das Skriptum oder eine allgemeine Erklärung des Ersetzbarkeitsprinzips) beantworten.
Gruppe/Aufgabe3. Das Programm soll von diesem Verzeichnis aus durch
java Testaufrufbar sein. Schreiben Sie nicht mehr als eine Klasse in jede Datei. Das Verzeichnis soll zu den Abgabezeitpunkten alle
.java-Dateien enthalten, die Sie für Ihre Lösung benötigen. Bitte entfernen Sie alle
.java-Dateien, die nicht zur Abgabe gehören. Dateien mit anderen Endungen werden bei der Beurteilung nicht berücksichtigt. Verzichten Sie auf die Verwendung von Verzeichnissen innerhalb von
Gruppe/Aufgabe3. Stellen Sie sicher, dass ein Aufruf von
javac *.javain
Gruppe/Aufgabe3keine Fehlermeldungen liefert, da Lösungen mit Syntaxfehlern in der Regel nicht beurteilt werden.