Schreiben Sie die Klassen Line und Text, die eine Text-Zeile bzw. einen gesamten Text bestehend aus Text-Zeilen repräsentieren sollen.
Zusätzlich soll es für die aktuelle Position im Text beim Editieren eine Klasse Cursor geben.
Überlegen Sie sich, wie Sie den Cursor in Beziehung zu den anderen Klassen setzen und schreiben Sie entsprechende Methoden zum Positionieren des Cursors und auch zum relativen Verschieben des Cursors (z. B. ein Zeichen nach rechts, eine Zeile nach oben). Diskutieren Sie verschiedene Möglichkeiten der Kapselung und wählen Sie die nach Ihrer Meinung beste aus (z. B. ist das Cursor-Objekt für den Benutzer sichtbar oder "hinter" Text "versteckt"?)
Realisieren Sie außerdem gezielt Methoden in Ihren Klassen, die folgendes Verhalten unterstützen:
* Rückgabe des gesamten Textes als String (bei größeren Texten evtl. beschränken auf eine bestimmte Zeilenzahl).
* Rückgabe der Zeile unter dem Cursor als String.
* Löschen des Zeichens unter dem Cursor.
* Ersetzen des Zeichens unter dem Cursor durch ein neues Zeichen (spezifiziert als Übergabeparameter).
* Einfügen eines Zeichens (Übergabeparameter) bzw. einer Zeichenfolge an der aktuellen Cursor-Position.
* Erfragen der Zeilennummer, bzw. der exakten Position des Cursors.
* Löschen der gesamten Zeile unter dem Cursor.
* Einfügen einer neuen Zeile (mit spezifiziertem Inhalt) vor dem Cursor.
* Erfragen der Länge der Zeile, auf der der Cursor steht (Zahl der Zeichen!).
* Erfragen der Länge des gesamten Texts.
Überlegen Sie die für diese Zwecke erforderlichen Attribute, definieren Sie geeignete Konstruktoren für die Klassen, und sorgen Sie dafür, daß eine sinnvolle Aufgabenteilung zwischen den Klassen entsteht.
Berücksichtigen Sie insbesondere das Prinzip "Kapselung".
Zur Speicherung der Zeichenfolge einer Zeile (in der Klasse Line) verwenden Sie nunmehr sinnvollerweise ein String-Objekt, zur "Manipulation" der Zeileninhalte somit Stringmethoden bzw. wo sinnvoll auch die Klasse StringBuffer (bzw. StringBuilder) und ihre Methoden.
Als Speichermodell für die Klasse Text soll eine doppelt verkettete Liste verwendet werden. Dabei könnte es hilfreich sein, jeweils ein Dummy-Element am Anfang und Ende der Liste zu verwenden.
Stellen Sie, bevor Sie mit der Codierung beginnen, die Zusammenhänge in einem Klassendiagramm dar. Wenn Sie ein geeignetes Tool dafür verwenden, können Sie daraus den Coderahmen für Ihre Klassen generieren lassen. Erstellen Sie exemplarisch für den Use-Case "Löschen des Zeichens unter dem Cursor" ein Sequenzdiagramm.
Schreiben Sie eine weitere Klasse, die als Testrahmen zum Austesten der in den Klassen Line, Cursor, und Text implementierten Methoden dient, indem Sie dort in einer sinnvollen Reihenfolge die Methoden der Klasse mit adhoc-gewählten Parametern aufrufen.
Gehen Sie bei der Entwicklung so vor, dass Sie erst isoliert die Klassen Line und Cursor, entwickeln und austesten, und erst anschließend die Klasse Text in Angriff nehmen.