Vertiefung der Programmierung

Schnittstellen (Interfaces)

📢 Zwischenevalution

Motivation

  • Abstrakte Klassen ermöglichen bereits Verallgemeinerungen
    • werden aber i.d.R. immer
      zur Spezialisierung verwendet

 

  • Können wir noch allgemeiner werden,
    indem wir fordern, dass Klassen "nur"
    noch einen Vertrag erfüllen müssen?

Alle Bilder sind gemeinfrei

🤔

Analogie (Sockel Leuchtmittel)

Alle Bilder sind gemeinfrei

Analogie (Steckdose)

Schließe an was Du willst, Hauptsache es passt in die Steckdose.

Gerät implementiert Schnittstelle (Euro-)Steckdose

Alle Bilder sind gemeinfrei

Eigenschaften

  • Interfaces definieren Vertrag, der erfüllt werden muss
    ➔ Paragraphen § = Methoden
     
  • Klasse, die Interface implementiert, muss alle Methoden des Interfaces umsetzen

 

  • im Gegensatz zu abstrakten Klassen sind innerhalb von Interfaces keine Attribute zulässig 
    (nur Konstanten, dazu später mehr)

§ §

Alle Bilder sind gemeinfrei

Definition: Interface

public interface IName {

  public Rückgabetyp iFuncName(Datentyp param1, ...);

 
 ...

}

class A implements IName {

  ...

}

Wichtig: Hier müssen alle Methoden des Interfaces implementiert werden.

⌨️ Beispiel (Circle: IResizable, IGeometricObject)

public interface IGeometricObject {
    double area();
    double perimeter();
}

public interface IResizable {
    void resize(double factor);
}

Kreis implementiert die Schnittstellen:

  • IGeometricObject ➔ Fläche & Umfang messbar
  • IResizable  Vergrößern/verkleinern möglich

⌨️ Beispiel (Circle: IResizable, IGeometricObject)

public class Circle implements IResizable, IGeometricObject {
    private double x, y;
    private double radius;
	public Circle(double x, double y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }
    
	public double area() {
        return Math.PI * this.radius * this.radius;
    }
    
	public double perimeter() {
        return 2.0 * Math.PI * this.radius;
    }
    
	public void resize(double factor) {
        this.radius *= factor;
    }
}

⌨️ Aufgabe: IMoveable

10 Min

Erweitern Sie das Beispiel um ein weiteres Interface IMoveable:

  • Die Methode move(x, y) soll dabei den Ursprung (der Form) auf die absolute Position (x, y) ändern.

Hinweis: Sie können den Code des vorher-gehenden Beispiels einfach mit 

kopieren (Symbol: rechte, obere Ecke)

⌨️ Lösung: IMoveable

10 Min

Abstrakte Klassen vs. Schnittstellen

  • Abstrakte Klassen sind i.d.R. ganz
    oben in Verberbungshierarchien 
    • Bsp. Spinnentiere, Formen
  • Idee: Wir spezialisieren Typen

🕷️

  • Schnittstellen können, müssen aber nicht, in Vererbungshierarchien eingebunden sein
    • Mehrere Schnittstellen in einer Klasse
  • Idee: Umsetzung von Eigenschaften

🐦‍⬛

Exkurs: Mehrfachvererbung

Alle Bilder sind gemeinfrei

Mehrfachvererbung ist in Java nicht möglich (in anderen Sprachen aber schon). Hier helfen (in Java) nur Interfaces.

Polymorphie (=Vielgestaltigkeit)

  • Abstrakte Klassen, Vererbung und Schnittstellen erlauben flexible Zuweisungen von Objektinstanzen (Variablen)
  • Beispiele:

🦂

Spinnentier spinne = new Skorpion();

🕷️

🐦‍⬛

Vogel vogel = new Emu();

🐧

🐦‍⬛🐦‍⬛🐦‍⬛

List<Vogel> voegel = List.of(new Emu(), new Pinguin(), new Emu());

Zusammenfassung

  • Schnittstellen (Interfaces) sind noch allgemeiner
    als abstrakte Klassen
    • Alle Interface-Methoden müssen implementiert werden ➔ § Vertrag
    • Interfaces haben keine Attribute (nur Konstanten)
  • Schnittstellen können Eigenschaften umsetzen
  • Schnittstellen können zur Umsetzung von
    Mehrfachvererbung "zweckentfremdet" werden
  • Polymorphie erlaubt flexiblen Einsatz 

Alle Bilder sind gemeinfrei