Benutzer-Werkzeuge

Webseiten-Werkzeuge


polymorphismus:abstractclasses

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
polymorphismus:abstractclasses [2023/03/10 10:10] Martin Pabstpolymorphismus: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%>
-{{ :polymorphismus:pasted:20230309-175338.png?400 }} +{{ :polymorphismus:pasted:20230309-175706.png?400 }} 
-Es macht eigentlich keinen Sinn, die Methode ''sagwas()'' in der Klasse Tier zu implementieren. Es würde reichen, sie dort nur zu deklarieren und die Implementierung den Unterklassen ''Katze'' und ''Hund'' zu überlassen:+Es macht eigentlich **keinen** Sinn, die Methode ''sagwas()'' in der Klasse Tier zu implementieren. Es würde reichen, sie dort nur zu **deklarieren** (''void sagwas();''und die **Implementierung** (d.h. die Erstellung der Anweisungen in der Methode drin) den Unterklassen ''Katze'' und ''Hund'' zu überlassen. Dies können wir erreichen, indem wir die Klasse Tier und die Methode ''sagwas()'' als **abstract** deklarieren: 
 +{{ :polymorphismus:pasted:20230310-115633.png }} 
 +**Merke:** \\  
 +  * Wird eine Methode in einer Klasse nur **deklariert**, aber nicht **implementiert**, so nennt man sie **abstrakte Methode**.  
 +  * Eine Klasse, die mindestens eine abstrakte Methode besitzt, heißt **abstrakte Klasse**. 
 +  * Von einer abstrakten Klasse kann man keine Objekte instanzieren, wohl aber von Unterklassen, bei denen alle abstrakten Methoden implementiert sind. 
 +  * Der Compiler stellt sicher, dass jede nicht-abstrakte Unterklasse einer abstrakten Klasse für alle abstrakten Methoden eine Implementierung besitzt.
 </WRAP> </WRAP>
  
 <HTML> <HTML>
  
-<div class="java-online" style="height: 50vh; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'polymorphismus4'}">+<div class="java-online" style="height: 50vh; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'polymorphismus5'}">
  
 <script type="text/plain" title="Test1.java"> <script type="text/plain" title="Test1.java">
Zeile 64: Zeile 70:
  
 </HTML> </HTML>
 +
 +===== Beispiel 2: Raumschiff mit verschiedenen Kanonen =====
 +<WRAP center round info 100%>
 +{{ :polymorphismus:pasted:20230310-120603.png }}
 +</WRAP>
 +
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 50vh; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'polymorphismus6'}">
 +
 +<script type="text/plain" title="Spaceship.java">
 +Spaceship s = new Spaceship();
 +s.useGun(new TripleGun());
 +
 +class Spaceship extends Sprite {
 +   
 +   Gun gun;
 +   int lastTimeFired = 0;
 +   
 +   Spaceship() {
 +      super(50, 300, SpriteLibrary.Space_Shooter_1, 0);
 +      gun = new SimpleGun();
 +   }
 +   
 +   void useGun(Gun gun) {
 +      this.gun = gun;
 +   }
 +
 +   public void act() {
 +      if(isKeyDown(Key.ArrowUp)) {
 +         move(0, -8);
 +      }
 +      if(isKeyDown(Key.ArrowDown)) {
 +         move(0, 8);
 +      }
 +
 +      if(isKeyDown(" ") && System.currentTimeMillis() - lastTimeFired > 300) {
 +         lastTimeFired = System.currentTimeMillis();
 +         gun.fire(getCenterX() + 15, getCenterY()); 
 +      }
 +      
 +   }
 +}
 +</script>
 +
 +<script type="text/plain" title="Gun.java">
 +abstract class Gun {
 +   
 +   abstract void fire(double x, double y);
 +
 +}
 +
 +class SimpleGun extends Gun {
 +   
 +  public void fire(double x, double y) {
 +      new Projectile(x, y, 15, 0);
 +  }
 +
 +}
 +
 +class TripleGun extends Gun {
 +   public void fire(double x, double y) {
 +      new Projectile(x, y, 15, 0);
 +      new Projectile(x, y, 10, -4);
 +      new Projectile(x, y, 10, 4);  
 +   }
 +}
 +
 +class Projectile extends Sprite {
 +   double vx, vy;
 +   Projectile(double x, double y, double vx, double vy) {
 +      super(x, y, SpriteLibrary.Space_Shooter_1, 5); 
 +      this.vx = vx;
 +      this.vy = vy;
 +   }
 +
 +   public void act() {
 +      move(vx, vy);
 +      if(isOutsideView()) {
 +         destroy();
 +      }
 +   }
 +}
 +</script>
 +
 +</div>
 +
 +
 +</HTML>
 +
 +
 +<WRAP center round todo 80%>
 +**Aufgabe: ** \\ \\ 
 +Erfinde eine andere Art von Kanone, schreibe eine entsprechende Klasse und probiere sie im obigen Programm aus.
 +</WRAP>
 +
polymorphismus/abstractclasses.1678443026.txt.gz · Zuletzt geändert: 2023/03/10 10:10 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki