polymorphismus:abstractclasses
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
polymorphismus:abstractclasses [2023/03/10 09:35] – angelegt Martin Pabst | polymorphismus:abstractclasses [2023/03/12 19:34] (aktuell) – [Beispiel 2: Raumschiff mit verschiedenen Kanonen] Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
===== Abstrakte Klassen ===== | ===== Abstrakte Klassen ===== | ||
<WRAP center round info 100%> | <WRAP center round info 100%> | ||
- | {{ : | + | {{ : |
- | Es macht eigentlich keinen Sinn, die Methode '' | + | Es macht eigentlich |
+ | {{ : | ||
+ | **Merke:** \\ | ||
+ | * Wird eine Methode in einer Klasse nur **deklariert**, | ||
+ | * Eine Klasse, die mindestens eine abstrakte Methode besitzt, heißt **abstrakte Klasse**. | ||
+ | * Von einer abstrakten Klasse kann man keine Objekte instanzieren, | ||
+ | * Der Compiler stellt sicher, dass jede nicht-abstrakte Unterklasse einer abstrakten Klasse für alle abstrakten Methoden eine Implementierung besitzt. | ||
</ | </ | ||
< | < | ||
- | <div class=" | + | <div class=" |
<script type=" | <script type=" | ||
+ | Tier t = new Katze(" | ||
+ | t.sagwas(); | ||
+ | t = new Hund(" | ||
+ | t.sagwas(); | ||
+ | |||
+ | |||
+ | abstract class Tier { | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | this.art = art; | ||
+ | } | ||
+ | |||
+ | void stellDichVor() { | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | class Katze extends Tier { | ||
+ | |||
+ | | ||
+ | super(name, " | ||
+ | } | ||
+ | |||
+ | void sagwas() { | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | class Hund extends Tier { | ||
+ | |||
+ | | ||
+ | super(name, " | ||
+ | } | ||
+ | |||
+ | void sagwas() { | ||
+ | println(" | ||
+ | } | ||
+ | } | ||
</ | </ | ||
Zeile 18: | Zeile 70: | ||
</ | </ | ||
+ | |||
+ | ===== Beispiel 2: Raumschiff mit verschiedenen Kanonen ===== | ||
+ | <WRAP center round info 100%> | ||
+ | {{ : | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Spaceship s = new Spaceship(); | ||
+ | s.useGun(new TripleGun()); | ||
+ | |||
+ | class Spaceship extends Sprite { | ||
+ | |||
+ | Gun gun; | ||
+ | int lastTimeFired = 0; | ||
+ | |||
+ | | ||
+ | super(50, 300, SpriteLibrary.Space_Shooter_1, | ||
+ | gun = new SimpleGun(); | ||
+ | } | ||
+ | |||
+ | void useGun(Gun gun) { | ||
+ | this.gun = gun; | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(isKeyDown(Key.ArrowUp)) { | ||
+ | | ||
+ | } | ||
+ | if(isKeyDown(Key.ArrowDown)) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | if(isKeyDown(" | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | abstract class Gun { | ||
+ | |||
+ | | ||
+ | |||
+ | } | ||
+ | |||
+ | class SimpleGun extends Gun { | ||
+ | |||
+ | public void fire(double x, double y) { | ||
+ | new Projectile(x, | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | class TripleGun extends Gun { | ||
+ | | ||
+ | new Projectile(x, | ||
+ | new Projectile(x, | ||
+ | new Projectile(x, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Projectile extends Sprite { | ||
+ | | ||
+ | | ||
+ | super(x, y, SpriteLibrary.Space_Shooter_1, | ||
+ | this.vx = vx; | ||
+ | this.vy = vy; | ||
+ | } | ||
+ | |||
+ | | ||
+ | move(vx, vy); | ||
+ | if(isOutsideView()) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | <WRAP center round todo 80%> | ||
+ | **Aufgabe: ** \\ \\ | ||
+ | Erfinde eine andere Art von Kanone, schreibe eine entsprechende Klasse und probiere sie im obigen Programm aus. | ||
+ | </ | ||
+ |
polymorphismus/abstractclasses.1678440932.txt.gz · Zuletzt geändert: 2023/03/10 09:35 von Martin Pabst