Benutzer-Werkzeuge

Webseiten-Werkzeuge


klassen2:abstrakt:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
klassen2:abstrakt:start [2020/04/29 12:43] – [Abstrakte Methoden] Martin Pabstklassen2:abstrakt:start [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 ====== Abstrakte Klassen ====== ====== Abstrakte Klassen ======
 +
 +{{ youtube>Aekx2HXnEVg?large }}
 + \\ 
 + \\ 
 Oft ist es nicht sinnvoll, Objekte einer Oberklasse zu instanzieren, weil sie "abstrakt" ist, d.h. noch nicht über alle Attribute/Methoden verfügt. Wir sehen uns dazu wieder ein einfaches Beispiel an: Die Klasse ''Tier'' besitzt ein Attribut ''art''. Von ihr leiten wir die Unterklassen ''Hund'' und ''Katze'' ab: Oft ist es nicht sinnvoll, Objekte einer Oberklasse zu instanzieren, weil sie "abstrakt" ist, d.h. noch nicht über alle Attribute/Methoden verfügt. Wir sehen uns dazu wieder ein einfaches Beispiel an: Die Klasse ''Tier'' besitzt ein Attribut ''art''. Von ihr leiten wir die Unterklassen ''Hund'' und ''Katze'' ab:
  
 <HTML> <HTML>
  
-<div class="java-online" style="height: 400px; width: 100%" data-java-online="{}">+<div class="java-online" style="height: 400px; width: 100%" data-java-online="'id': 'Abstrakt1', 'withBottomPanel': true}"
 + 
 +<script type="text/plain" title="Main.java"> 
 +Hund h = new Hund("Pluto"); 
 +Katze k = new Katze("Snoopy"); 
 +h.schreibeName(); 
 +k.schreibeName(); 
 +</script>
  
 <script type="text/plain" title="Tier.java"> <script type="text/plain" title="Tier.java">
Zeile 20: Zeile 31:
       println("Art: " + art);       println("Art: " + art);
    }    }
 +
 +   public void schreibeName() {
 +      println("Ich heiße " + name);
 +   }
 +
  
 } }
Zeile 50: Zeile 66:
 Jedes Tier soll eine Methode ''sagwas()'' besitzen. Ruft man die Methode für ein Objekt der Klasse Hund auf, so soll "Wau, wau!" ausgegeben werden, ruft man sie für ein Objekt der Klasse Katze auf, so soll "Miau" ausgegeben werden. Wenn wir - wie im Kapitel [[klassen2:casting:start|Casting und der Operator instanceof]] - die Methode ''sagwas()'' in den Klassen ''Hund'' und ''Katze'' implementieren, dann können wir sie nur aufrufen, wenn die Objektvariable vom Datentyp ''Hund'' oder ''Katze'' ist. Bei Objektvariablen vom Typ ''Tier'' müssen wir vorher mithilfe des Operators ''instanceof'' herausfinden, um welche Klasse es sich handelt und dann entsprechend casten. \\  Jedes Tier soll eine Methode ''sagwas()'' besitzen. Ruft man die Methode für ein Objekt der Klasse Hund auf, so soll "Wau, wau!" ausgegeben werden, ruft man sie für ein Objekt der Klasse Katze auf, so soll "Miau" ausgegeben werden. Wenn wir - wie im Kapitel [[klassen2:casting:start|Casting und der Operator instanceof]] - die Methode ''sagwas()'' in den Klassen ''Hund'' und ''Katze'' implementieren, dann können wir sie nur aufrufen, wenn die Objektvariable vom Datentyp ''Hund'' oder ''Katze'' ist. Bei Objektvariablen vom Typ ''Tier'' müssen wir vorher mithilfe des Operators ''instanceof'' herausfinden, um welche Klasse es sich handelt und dann entsprechend casten. \\ 
 Viel klarer wäre es doch, wenn die Klasse ''Tier'' eine Methode ''sagwas()'' enthalten würde, diese Methode aber erst in ihren Unterklassen mit Inhalt gefüllt wird. Das geht, wenn wir sowohl die Klasse ''Tier'' als auch die Methode ''sagwas()'' als ''abstract'' kennzeichnen: Viel klarer wäre es doch, wenn die Klasse ''Tier'' eine Methode ''sagwas()'' enthalten würde, diese Methode aber erst in ihren Unterklassen mit Inhalt gefüllt wird. Das geht, wenn wir sowohl die Klasse ''Tier'' als auch die Methode ''sagwas()'' als ''abstract'' kennzeichnen:
 +<HTML>
 +
 +<div class="java-online" style="height: 400px; width: 100%" data-java-online="{'id': 'Abstrakt2', 'withBottomPanel': true}">
 +
 +<script type="text/plain" title="Main.java">
 +Hund h = new Hund("Pluto");
 +Katze k = new Katze("Snoopy");
 +
 +Tier t;
 +t = h;
 +t.sagwas();
 +
 +t = k;
 +t.sagwas();
 +
 +</script>
 +<script type="text/plain" title="Tier.java">
 +abstract class Tier {
 +   
 +   String art;
 +   String name;
 +
 +   public Tier(String art, String name) {
 +      this.art = art;
 +      this.name = name;
 +   }
 +
 +   abstract public void sagwas();
 +
 +   public void schreibeArt() {
 +      println("Art: " + art);
 +   }
 +
 +}
 +</script>
 +<script type="text/plain" title="Hund.java">
 +class Hund extends Tier {
 +   
 +   public Hund(String name) {
 +      super("Hund", name);
 +   }
 +
 +   public void sagwas() {
 +      println("Wau, wau!", Color.lightblue);
 +   }
 +
 +}
 +</script>
 +<script type="text/plain" title="Katze.java">
 +class Katze extends Tier {
 +   
 +   public Katze(String name) {
 +      super("Katze", name);
 +   }
 +
 +   public void sagwas() {
 +      println("Miau, miau!", Color.yellow);
 +   }
 +
 +}
 +</script>
 +
 +</div>
 +
 +</HTML>
 +
 +<WRAP center round important 60%>
 +Die Deklaration der Methode
 +<code>
 +abstract public void sagwas();
 +</code>
 +in der Klasse ''Tier'' **verpflichtet** alle Unterklassen von Tier, diese Methode mit genau dieser Signatur zu implementieren. Sie sorgt gleichzeitig dafür, dass man mit einer Variable vom Typ ''Tier'' dann diese Methode aufrufen kann, egal, zu welcher Unterklasse von ''Tier'' das Objekt gehört, auf das die Variable zeigt.
 +</WRAP>
 +
 +<WRAP center round info 60%>
 +Eine Klasse kann nur dann abstrakte Methoden enthalten, wenn sie selbst mit dem Schlüsselwort ''abstract'' gekennzeichnet ist. Das sorgt dafür, dass keine Objekte dieser Klasse instanziert werden können (was nicht geht, weil die abstrakten Methoden ja keinen Programmtext besitzen, der ausgeführt werden könnte).
 +</WRAP>
 +
 +===== Klassendiagramm =====
 +<WRAP center round info 60%>
 +{{ :klassen2:abstrakt:pasted:20210424-215332.png?200}}
 +Der UML-Standard sieht vor, dass die Bezeichner abstrakter Klassen und Methoden **in Schrägschrift** gesetzt werden. Vor den Klassenbezeichner kann wahlweise zusätzlich das Präfix "<<abstract>>" geschrieben werden.
 +</WRAP>
  
klassen2/abstrakt/start.1588157027.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki