Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, habe eine Anfängerfrage für die ich keine Antwort gefunden habe.
Hier der Code-Ausschnitt:
Java:
interface CharEingabeStrom {
int read() throws IOException;
}
und
Java:
class GrossBuchstabenFilter implements CharEingabeStrom {
private CharEingabeStrom eingabeStrom;
public GrossBuchstabenFilter( CharEingabeStrom cs ) { eingabeStrom = cs; }
public int read() throws IOException {
/* hier*/int z = eingabeStrom.read();
if( z == -1 ) return -1;
else return Character.toUpperCase( (char)z );
}
}
und hier meine Frage: Warum wird /* hier*/ die Interface-Methode aufgerufen, die dort ja nur vereinbart, aber nicht implementiert ist. Leider kann ich das nicht entschlüsseln...
den Sinn dahinter sehe ich auch nicht so ganz, aber das scheint eine Art Wrapper um den
CharEingabeStrom zu sein. Als Erweiterung zum normalen CharEingabeStrom gibt dieser
(wie der Name GrossBuchstabenFilter schon sagt) die Buchstaben als Grossbuchstaben zurück.
Und da das die einzige Erweiterung ist und im Konstruktor ein CharEingabeStrom übergeben
wird, wird die eigentliche Implementierung des EingabeStroms dem übergebenen Objekt überlassen.
Und damit die Klasse überall verwendet werden kann wo ein CharEingabeStrom erwartet wird,
implementiert der GrossBuchstabenFilter einfach das Interface.
hier wird nicht die Interface "Methode" aufgerufen, sondern die Methode read() an einem konkreten Objekt.
Der Konstruktor
Code:
public GrossBuchstabenFilter( CharEingabeStrom cs)
erwartet nämlich ein Objekt implements CharEingabeStrom nicht das Interface selbst (würde gar nicht gehen) --> somit ist eingabeStrom ein konkretes Objekt welches das Interface implementiert.
Sie ruft die read()-Methode des Objekts eingabeStrom auf.
Die kann durchaus anders implementiert sein. Dein GrossBuchstabenFilter ist wie gesagt ein Wrapper, den du auf einen anderen CharEingabeStrom legen kannst und dir die eingelesenen Zeichen als Grossbuchstaben zurückgibt.
public class Interfaces {
public static void main(String[] args) {
A b = new B();
A c = new C(b);
c.tuWas();
}
}
interface A{
public void tuWas();
}
class B implements A{
public void tuWas() {
System.out.println("Klasse B: tuWas()");
}
}
class C implements A{
A a;
public C(A a) {
this.a = a;
}
public void tuWas() {
System.out.println("Klasse C: tuWas()");
a.tuWas();
}
}
Ausgabe:
Klasse C: tuWas()
Klasse B: tuWas()