Ihre Aufgabe ist, unter Verwendung des jeweils geeigneten der drei oben angegebenen Typen, eine Klasse ReadOnly und eine Klasse WriteOnly zu erstellen.
Nur Leseoperationen und Schreiboperationen für Strings
Das ist für die Aufgabe egal - das ist nur ein Interface und gegen das Interface solltest du implementieren
Unklar ist eher, wie die Klassen ReadOnly und WriteOnly aussehen sollen. Steht da nicht mehr dazu? In die richtige Richtung könnten beide Varianten hier gehen....
Das dachte ich auch zuerst doch dann müsste man ja die read() Methode selbst schreiben. Wenn ich ja eine Klasse habe die das Interface ReadStream<T> Implementiert muss das dort ja implementiert sein deswegen habe ich mich so entschieden.
Unklar ist eher, wie die Klassen ReadOnly und WriteOnly aussehen sollen. Steht da nicht mehr dazu? In die richtige Richtung könnten beide Varianten hier gehen....
Bei den Klassen stehen noch 2 Kommentaren hier mal was dort steht
Code:
class ReadOnly {
//Definieren Sie eine Variable eingabe zum Lesen von Strings
... <- soll unser Programmcode hin
//Hier Methode zum Lesen einfügen
...
}
class WriteOnly {
//Definieren Sie eine Variable ausgabe zum Lesen von Strings
... <- soll unser Programmcode hin
//Hier Methode zum Schreiben einfügen
...
}
Die read-Methode hast du doch oben schon hingeschrieben...
Edit: Aber, da das Gerüst der Klasse "ReadOnly" oben bereits ohne "implements ReadStream<String>" angegeben ist, ist dein Ansatz wohl nicht ganz falsch.
Edit: Noch mal zum Implementieren des Interfaces. Genau das hast du ja gemacht, indem du in eine Methode mit der zum Interface passenden Signatur Code geschrieben hast, der das tut, was du möchtest.die Methode verlangt.
Naja meine Frage ist eigentlich eher die wieso ünnötig 2x das gleiche schreiben?
Wenn doch die Klasse IoStream die Interfaces implementiert dann stehen dort die Methoden zur Verfügung ich kann eine Instanz dieser Klasse erzeugen und diese Methoden nutzen oder habe ich dabei erneut ein Denkfehler und übersehe eben etwas das war die Frage
Denn andernfalls sollte das doch so gehen wie ich es oben geschrieben habe. Jetzt mal der Name der Variable außer acht gelassen. Denn andernfalls müsste man die T read() Methode selbst schreiben dabei könnte man ja den FileReader nutzen und immer 1 String lesen
Wenn doch die Klasse IoStream die Interfaces implementiert dann stehen dort die Methoden zur Verfügung ich kann eine Instanz dieser Klasse erzeugen und diese Methoden nutzen
Hättest du es so gemacht, wie ich in #2 geschrieben habe, dann hätte es genau deiner bereits gezeigten Implementation von read() entsprochen. Musst du aber nicht, wie wir aufgrund der Vorgabe (der Klassengerüste) gesehen haben.
Noch mal zum Implementieren des Interfaces. Genau das hast du ja gemacht, indem du in eine Methode mit der zum Interface passenden Signatur Code geschrieben hast, der das tut, was die Methode verlangt.
Achso, weil ich ja eh die read() Methode implementiere kann ich die Klasse implements Interface schreiben obwohl ich Intern die andere Klasse benutze und die meine Arbeit macht. So also:
Code:
class ReadOnly implements ReadStream<String> {
IOStream<String> eingabe = new IOStream<>("Dateipath");
String read() {
return (String) eingabe.read();
}
}
Achso, weil ich ja eh die read() Methode implementiere kann ich die Klasse implements Interface schreiben obwohl ich Intern die andere Klasse benutze und die meine Arbeit macht.
Genau so ist es. Du solltest dich allerdings an die vorgegebene Klasse halten und das "implements.." wieder entfernen.
Beachte noch den Hinweis von @mrBrown in #7 und mach einen sinnvollen Konstruktor, der dieses unschöne "Dateipath" beseitigt.
Edit: Ein Tipp von mir: Verwende beim Überschreiben/Implementieren von Methoden immer "@Override". Damit stellst du sicher, dass du auch tatsächlich die korrekte Signatur geschrieben hast. Im Fehlerfall würdest du eine Meldung vom Compiler erhalten. Außerdem zeigt es sofort, dass man hier eine Methode vor sich hat die überschrieben wird/ein Interface implementiert.
Noch was: Schau dir mal deine Deklaration von "eingabe" an und das Interface "ReadStream". Welchen Typ liefert demnach die Methode eingabe.read() zurück?
Noch was: Schau dir mal deine Deklaration von "eingabe" an und das Interface "ReadStream". Welchen Typ liefert demnach die Methode eingabe.read() zurück?
Edit: Ein Tipp von mir: Verwende beim Überschreiben/Implementieren von Methoden immer "@Override". Damit stellst du sicher, dass du auch tatsächlich die korrekte Signatur geschrieben hast. Im Fehlerfall würdest du eine Meldung vom Compiler erhalten. Außerdem zeigt es sofort, dass man hier eine Methode vor sich hat die überschrieben wird/ein Interface implementiert.
Und wenn IOStream nur den Konstruktor private IOStream(int i, float f, boolean b, List<String> strings, Void v) hat? Hint: ein Konstruktor, den du nicht kennt, kannst du nicht aufrufen - und in der Aufgabe wird keiner vorgegeben Oder hast du das unterschlagen?
benutzt werden kann.
Dann wäre ReadStream<T> ja mit InputStream überladen und man könnten diesen nutzen?
Oder ist das nun auch wieder ein Denkfehler
Wie behält man nur der Durchblick bei so vielen Klassen? Und dabei habe ich noch nicht mal angefangen mit GUI / JavaFX. Das sind dann ja gleich wieder ca. 1000 Klassen dazu
Darf man davon ausgehen das das Interface wie die Klasse hier: ReadStream benutzt werden kann.
Dann wäre ReadStream<T> ja mit InputStream überladen und man könnten diesen nutzen?
Oder ist das nun auch wieder ein Denkfehler
Wie behält man nur der Durchblick bei so vielen Klassen? Und dabei habe ich noch nicht mal angefangen mit GUI / JavaFX. Das sind dann ja gleich wieder ca. 1000 Klassen dazu
Ein Tipp von mir: Verwende beim Überschreiben/Implementieren von Methoden immer "@Override". Damit stellst du sicher, dass du auch tatsächlich die korrekte Signatur geschrieben hast. Im Fehlerfall würdest du eine Meldung vom Compiler erhalten. Außerdem zeigt es sofort, dass man hier eine Methode vor sich hat die überschrieben wird/ein Interface implementiert.
Ich muss mich noch einmal zitieren, mit einem Hinweis:
Die beiden Klassen deiner Lösung erweitern ("extends") keine andere Klasse und implementieren auch kein Interface. Damit ist die Methode "read()" einfach nur eine Methode, die mehr oder weniger zufällig so heißt, wie die Methode im Interface. In diesem Fall solltest du vom Compiler einen Fehler erhalten, weil du ihm mitteilst, dass du eine Methode überschreiben möchtest, dies aber tatsächlich nicht der Fall ist.
Mir fällt nichts besseres ein als das von oben.
Hab es mal nur über einen BufferedReader versucht. Dann sollte zwar der Konstruktor stimmen doch dann macht es im Sinne der Aufgabe sicherlich keinen Sinn mehr
An deiner ersten Lösung musst du nur minimal was anpassen, damit die richtig ist.
Du hast drei Typen - ReadStream, WriteStream und IOStream - und du musst nur Lesen: welches ist dann der geeignete Typ?
Die BufferedReader-Variante hat dagegen nichts mit der Aufgabe zu tun.