Vererbung ist ein Kernkonzept der OOP (objektorientierte Programmierung). Sie stellt eine IS-A-Beziehung dar. In der Programmierung bedeutet sie genau das, was sie auch im Englischen bedeutet: Man erbt Merkmale von der Elternklasse (in der Programmierung sind diese Merkmale normalerweise Funktionen und Variablen).
Betrachte eine Klasse Animal wie hier gezeigt:
//Creating an Animal class with bark() as a member function.
public class Animal {
public void bark() {
System.out.println("This is an animal");
}
}
Animal ist eine Elternklasse, weil ihre Merkmale auf alle Tiere im Allgemeinen erweitert werden können.
Betrachte ein Tier namens Lion mit einer Klasse wie dieser:
//Lion class is a child class of Animal.
public class Lion extends Animal {
@Override
public void bark() {
System.out.println("Lion here!!");
}
}
Die Override-Annotation zeigt an, dass eine Methode in einer Unterklasse eine Methode ihrer Oberklasse überschreibt.
Sie ist nicht unbedingt nötig, aber es gilt als bewährte Praxis, sie zu verwenden.
Wenn wir nun Folgendes schreiben:
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
Beachte: Hier wird die Klasse Animal mit Lion initialisiert.
Die Ausgabe sieht dann so aus:
Lion here!!
In der OOP gibt es viele Arten der Vererbung, aber Java unterstützt nur einige davon (mehrstufige und hierarchische Vererbung). Mehr dazu erfährst du hier.
In dieser Übung spielst du ein Rollenspiel, in dem verschiedene Arten von Kämpfern gegeneinander antreten können. Das Spiel hat für jede Art von Kämpfer andere Regeln. Wir konzentrieren uns auf zwei bestimmte Arten: Zauberer und Krieger.
Für einen Krieger gelten diese Regeln:
6 Schadenspunkte, wenn der Kämpfer, den er angreift, nicht verwundbar ist.10 Schadenspunkte, wenn der Kämpfer, den er angreift, verwundbar ist.Für einen Zauberer gelten diese Regeln:
12 Schadenspunkte, wenn er einen Zauberspruch vorbereitet hat.3 Schadenspunkte, wenn er keinen Zauberspruch vorbereitet hat.Warrior-KlasseErstelle eine neue Klasse namens Warrior.
Diese Klasse sollte von der vorhandenen Fighter-Klasse erben.
Aktualisiere die Warrior-Klasse so, dass ihre toString()-Methode beschreibt, um welche Art von Kämpfer es sich handelt.
Die Methode sollte den String "Fighter is a Warrior" zurückgeben.
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
Aktualisiere die Warrior-Klasse so, dass ihre isVulnerable()-Methode immer false zurückgibt.
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
Aktualisiere die Warrior-Klasse so, dass ihre getDamagePoints(Fighter)-Methode den Schaden berechnet, den ein Krieger gemäß den obigen Regeln verursacht.
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
Wizard-KlasseErstelle eine weitere neue Klasse namens Wizard.
Diese Klasse sollte ebenfalls von der vorhandenen Fighter-Klasse erben.
Aktualisiere die Wizard-Klasse so, dass ihre toString()-Methode beschreibt, um welche Art von Kämpfer es sich handelt.
Die Methode sollte den String "Fighter is a Wizard" zurückgeben.
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
Aktualisiere die Wizard-Klasse, um eine Methode namens prepareSpell() hinzuzufügen.
Die Klasse sollte sich merken, wann diese Methode aufgerufen wird, und dafür sorgen, dass ihre isVulnerable()-Methode nur dann false zurückgibt, wenn ein Zauberspruch vorbereitet wurde.
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
Aktualisiere die Wizard-Klasse so, dass ihre getDamagePoints(Fighter)-Methode den Schaden berechnet, den ein Zauberer gemäß den obigen Regeln verursacht.
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
Melde dich bei Exercism an, um Java mit 26 Konzepte158 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.