franzlst: Interfaces - Verständnisfrage

Hallo,

ich bin gerade dabei, JAVA zu erlernen und zwar mit dem eBook von www.javabuch.de. Bin aber kein blutiger Anfänger sondern kann auch schon PHP und noch n paar C ähnliche Sprachen.
Jetzt bin ich beim Kapitel "Interfaces" angelangt und verstehe auch soweit, _wie_ man diese einsetzt, jedoch nicht _warum_.
Im Interface werden ja (u.a.) Methoden dbeschrieben. Die eigentliche Funktion erfolgt dann in den Klassen.
Wozu aber dann das Interface, wenn die Funktion eh in der Klasse steht?

Es wird auch ein Beispiel gebracht:
Interface:

public interface Groesse
{
   public int laenge();
   public int hoehe();
   public int breite();
}

Ein Beispiel für eine Implementierung:

public class FussballPlatz
implements Groesse
{
   public int laenge()
   {
     return 105000;
   }

public int hoehe()
   {
     return 0;
   }

public int breite()
   {
     return 70000;
   }
}

Nun kann man eine Methode schreiben:
public static long grundflaeche(Groesse g)
   {
     return (long)g.laenge() * g.breite();
   }

Diese gibt die Grundfläche eines Objekts zurück. Das könnte man aber doch auch genauso schreiben, wenn es das Interface nicht gäbe und dann statt "Groesse" Object schreibt, oder nicht?

Vielleicht kann mir das einer ja erklären, vermutlich stehe ich nur auf dem Schlauch :)

  1. Hallo franzlst,

    Nun kann man eine Methode schreiben:
    public static long grundflaeche(Groesse g)
       {
         return (long)g.laenge() * g.breite();
       }

    Diese gibt die Grundfläche eines Objekts zurück. Das könnte man aber doch auch genauso schreiben, wenn es das Interface nicht gäbe und dann statt "Groesse" Object schreibt, oder nicht?

    Nein, wenn Du Object schreiben würdest, könntest Du auch Objekte übergeben, die die erforderlichen Methoden nicht haben. Daher könntest Du diese auch nicht aufrufen.
    Alternativ könntest Du die Methode natürlich auch direkt für "Fussballplatz" deklarieren, dann müsstest Du aber die selbe Methode für jede andere Klasse, die eine Größe hat, noch mal schreiben.

    Interfaces beschreiben eben eine Schnittstelle, damit man diese Schnittstelle an anderen Stellen im Code verwenden kann, ohne die konkrete Klasse zu kennen.

    Grüße

    Daniel

    1. Hallo Daniel,

      Nein, wenn Du Object schreiben würdest, könntest Du auch Objekte übergeben, die die erforderlichen Methoden nicht haben. Daher könntest Du diese auch nicht aufrufen.

      OK, das sehe ich ein.

      Alternativ könntest Du die Methode natürlich auch direkt für "Fussballplatz" deklarieren, dann müsstest Du aber die selbe Methode für jede andere Klasse, die eine Größe hat, noch mal schreiben.

      So muss ich die Methode doch auch für jede Klasse schreiben, oder nicht?
      Oder nimmt eine 2. Klasse, die auch Groesse implementiert und selbst die Methoden nicht neu definiert, die Methoden von Fussballplatz (bezweifle ich)?

      Interfaces beschreiben eben eine Schnittstelle, damit man diese Schnittstelle an anderen Stellen im Code verwenden kann, ohne die konkrete Klasse zu kennen.

      Versteh ich leider nicht ganz, ich muss doch über die Klasse wissen, ob es Groesse implementiert, dann kann ich doch auch genauso gut wissen, dass es diese Methoden selbst definiert (ohne Interface).

      Grüße

      Franz

      1. Hallo,

        So muss ich die Methode doch auch für jede Klasse schreiben, oder nicht?

        Ja, aber es ist sichergestellt, dass der Aufbau der Methoden, die aus der Implementierung des Interfaces resultieren, immer gleich ist.

        Oder nimmt eine 2. Klasse, die auch Groesse implementiert und selbst die Methoden nicht neu definiert, die Methoden von Fussballplatz (bezweifle ich)?

        Nein, aber wenn sie das Interface impementiert, muss sie die Methoden in gleicher Weise aufbauen.

        Interfaces beschreiben eben eine Schnittstelle, damit man diese Schnittstelle an anderen Stellen im Code verwenden kann, ohne die konkrete Klasse zu kennen.
        Versteh ich leider nicht ganz, ich muss doch über die Klasse wissen, ob es Groesse implementiert,

        Warum? Du musst nicht wissen, welche Klassen es gibt, die ein bestimmtes Interface implementieren. Du musst nur wissen, dass es dieses Interface gibt.

        dann kann ich doch auch genauso gut wissen, dass es diese Methoden selbst definiert (ohne Interface).

        Und dann? Wie willst Du anderen Klassen diese Methoden zur Verfügung stellen? Eine Klasse kann _genau_ eine Superklasse erweitern. Mehrfachvererbung gibt es nicht.

        Im Java Tutorial gibt es dazu das Beispiel der Klasse "Fahrrad". Die Klasse selbst beschreibt was ein Objekt können und darstellen muss, um ein Fahrrad zu sein.

        Fahrräder werden aber eben auch verkauft. Hierfür brauchen sie Eigenschaften wie Bestellnummer, Preis usw. Verkauft werden aber auch Autos, Videorekorder, Bücher ... auch die brauchen dafür Bestellnummer und Preis.

        Nun könnte man die Beschreibung der Verkaufbarkeit den einzelnen Klassen überlassen. Dann würde es aber garantiert vorkommen, dass ein Klasse die Eigenschaften "int BestNr" und "float Preis", eine andere "String ISBN-Nr" und "double Preis", eine weitere ... definiert.

        Die Verkaufbarkeit ist deshalb ein Interface und jedes verkaufbare Objekt implementiert dieses Interface mit den selben Definitionen und akzeptiert somit eine Vereinbarung, die die Verkaufbarkeit regelt.

        Außerdem kann eine Klasse mehrere Interfaces implementieren, wogegen sie nur eine Klasse erweitern(beerben) kann. So kann ein Fahrrad nicht nur Verkaufbarkeit, sondern auch z.B. einen Wartungsplan und/oder Entsorgungshinweise implementieren.

        viele Grüße

        Axel

        1. Hallo Axel,

          danke für deine ausführliche Ausführung. Ich denke, ich habs jetzt verstanden. Dann kann ich ja endlich weiterlesen :-)

          gn8

          Franz