Abstraktion, Assoziation, interface?

Googlehupf

Erfahrenes Mitglied
Hallo!

Was bedeuten denn diese 3 Begriffe?

1. interface: Also interface schreibt man statt class und die jeweiligen Methoden haben keinen Funktionskörper. Was hat das für einen Sinn? Stimmts wie ich es erklärt hab, oder kann man das besser erklären.

2. Abstraktion: Hier habe ich null Ahnung.

3. Assoziation: Naja ich kenn hier nur die Bsp, also das ist einfach die Beziehung von 2 Objekten(oder?): Ein Flugzeug hat ein Bugrad, ist aber kein Bugrad. Der Flughafen hat eine Landebahn, das Flugzeug ist keine Landebahn.
Das Flugzeug benutzt eine Landebahn.

Was sollen diese Sätze jetzt aussagen?

Trotz Google und mehrfaches durchlesen in Wikipedia und meines Docs ist es mir nicht gelungen diese Begriffe zu verstehn, darum bitte erklärt mir diese Begriffe genau und nennt vielleicht Beispiele zu den Themen.

Danke im voraus!

mfg
 
Hallo Googlehupf,

das was Du beschreibst kommt aus der Welt der OOP und dem Modellieren. Es gibt noch viele andere Konstrukte, aber zunächst mal die von dir erfragten:

Interface: Das Interface legt die Schnittstelle fest. Das heißt, dass nur die "Signatur" (Name, Anzahl und Reihenfolge der Argumente) der Funktion wichtig ist. Es ist quasi die Regel, wie alle erbenden Klassen seien müssen. In der Regel werden in einem Interface alle public und protected Methoden festgehalten. Warum? Stell dir vor Du nutzt auf deiner Seite die Klasse von jemand anderen. Er nutzt kein Interface und ändert beim nächsten Update nur einen Methodennamen. Würde deine Seite dann noch einwandfrei laufen? Nein und das hätte das Interface verhindert bzw. den Programmierer drauf aufmerksam gemacht.

Abstraktion: Dein Flugzeug. Ist es ein Fortbewegungsmittel? Jedes Fortbewegungsmittel hat eine Geschwindigkeit, eine Länge, eine Breite und Kosten. (fällt dir noch mehr ein?) In einer abstrakten Klasse kannst du also z.B. so Methoden wie getGeschwindigkeit(), getKosten(), bewege() festhalten. Steht diese Abstraktion einmal, dann kannst innerhalb von Sekunden ein Auto, ein Flugzeug, ein Fahrrad als "echte" Klassen definieren die alle von deinem abstrakten Fortbewegungsmittel erben. Diese Sachen können dann alle die Geschwindigkeit und Kosten liefern und nur noch die feinen Unterschiede müssten von dir ergänzt werden. (das war nur ein Grund der Abstraktion)

Assoziation: Genau richtig. Sieh dir einmal UML (bzw. UML2) an. Die gängigen Beziehungen wie Flugzeug-HAT-Räder, Flugzeug-NUTZT-Landebahn und Flugzeug-IST-... hast Du schon entdeckt. Das wird später interessant, wenn Du größere Projekte planst und deine ersten 5000 Zeilen Code zusammen hast. Wenn Du dann kein Diagramm hast, wo welche Klasse genutzt wird und wie der Aufbau ist, dann wird es selbst für dich schwer deinen Code zu lesen. Stell dir vor ich gebe dir nur 10 Klassen von mir und weiter nichts. Ohne Diagramm und wissen über die Beziehungen, bräuchtest lange und es wäre mühsam sich dort einzuarbeiten. Lies hierzu vllt auch etwas zu Design-Pattern.
 
Ohne Diagramm und wissen über die Beziehungen, bräuchtest lange und es wäre mühsam sich dort einzuarbeiten. Lies hierzu vllt auch etwas zu Design-Pattern.

Wobei ich immer noch nicht weiss wie so ein Diagramm erstellt wird ... Da suche ich immer noch die Passende Software zu die sowas aus vorhanden Code erstellen kann.

zu 1)
eine Schnittstelle sorgt dafür das die dort definierten Functionen auch in der Kasse definiert sind.
Sowas wird gebraucht wenn Classen zusammenarbeiten sollen.

Code:
interface schnittstelle {
 public int getWertBla();
}

class BenutztEs implements schnittstelle {
// dann muss hier das stattfinden:
public int getWertBla()  {
 return denwert;
}
damit weiss die nächste Classe (bzw der Programmierer) das "BenutztEs" auf jedenfall die Function "getWertBla()" hat weil sie die "schnittstelle" imlementiert.
 
Zuletzt bearbeitet:
Danke euch!

Flugzeug hat ein Bugrad. Flugzeug benutzt eine Landebahn.

"benutzt ein", "hat ein", "ist ein" --> Wie kann man das in Java-Code darstellen?

Flugzeug benutzt Landebahn. Flugzeug ist Klasse und Landebahn die Methode?
 
Nein, Flugzeug ist eine Klasse und Landebahn ist eine Klasse. Daraus erstellt man jeweils ein Objekt z.b. Boing737 und FlughafenFrankfurtBahn26.

Zur Frage: "benutzt ein"

Boing737 bietet eine Methode landen() an. Diese Methode landen() erwartet einen Paramter vom Typ Klasse Landebahn. Dort kannst du dann das Objekt FlughafenFrankfurtBahn26 übergeben.

Java:
public class Landebahn
{
  private int laenge;

  public Landebahn(int laenge)
  {
    this.laenge = laenge;
  }

  public int getLaenge()
  {
    return this.laenge;
  }
}

public class Flugzeug
{
  private int minimalLaengeLandebahn;

  public Flugzeug(int minimalLL)
  {
    this.minimalLaengeLandebahn = minimalLL;
  }

  public void landen(Landebahn bahn)
  {
     if( bahn.getLaenge() < this.minimalLaengeLandebahn )
     {
       throw new LandeBahnZuKurzException();
     }
  }
}

Zur Frage "hat ein":

Java:
public class Bugrad
{
  private double bereifungsStaerke;

  public Bugrad(double bs)
  {
    this.bereifungsStaerke = bs;
  }

  public double getBereifungsStaerke()
  {
    return this.bereifungsStaerke;
  }
}

public class Flugzeug
{
  private Bugrad bugrad;

  public Flugzeug()
  {
    this.bugrad = new Bugrad(24.7);
  }
}

Wie man sieht, hat die Klasse Flugzeug eine Eigenschaft bugrad vom Typ Klasse Bugrad. Innerhalb der Klasse Flugzeug (also in jedem aus der Klasse Flugzeug erschaffenen Objekt) kann man dann auf bugrad zugreifen.

Zur Frage "ist ein":

Java bietet einen Operator instanceof an. Den kann man so verwenden:

Java:
  public void machWasMit(Object o)
  {
    Stadt berlin = new Stadt();
    if( o instanceof Flugzeug )
    {
      Flugzeug flugzeug = (Flugzeug)o;
      flugzeug.fliegeNach(berlin); // Wenn die Klasse Flugzeug eine Methode fliegeNach() anbietet, mit Parameter vom Typ Klasse "Stadt"
    }
  }
 
Zuletzt bearbeitet:
Danke!

kann mir einer noch die Befehle this und super() erklären?

Also super() weiß ich ca. schon, das ruft den Konstrukter der Oberklasse von der abgeleitet wurde.

Also:

Java:
puplic class MainFrame extends JFrame
{
   puplic MainFrame 
   {
      super();
   }
}

Also wird der Konstruktor von JFrame aufgerufen. Und was für Sinn hat das?
 
this: Bezieht sich immer auf das aktuelle Objekt (also sich selbst).

super(): Wenn du eine abgeleitete Klasse erstellst, die einen eigenen Konstruktor hat, überschreibt dieser Konstruktor den der Eltern-Klasse. Wenn du den Code der Eltern-Klasse aber trotzdem ausführen lassen willst, musst du super() verwenden.
 
Zurück