La herencia es un concepto central en la POO (programación orientada a objetos). Representa una relación ES-UN. En programación significa literalmente lo mismo que en inglés: heredar características de un padre (en programación, esas características normalmente son funciones y variables).
Considera una clase Animal, como se muestra:
//Creating an Animal class with bark() as a member function.
public class Animal {
public void bark() {
System.out.println("This is an animal");
}
}
Animal es una clase padre, porque las propiedades que tiene esta clase se pueden extender a todos los animales en general.
Considera un animal llamado Lion, que tiene una clase como esta:
//Lion class is a child class of Animal.
public class Lion extends Animal {
@Override
public void bark() {
System.out.println("Lion here!!");
}
}
La anotación Override se usa para indicar que un método de una subclase está sobrescribiendo un método de su superclase.
No es estrictamente necesaria, pero es una buena práctica usarla.
Ahora, siempre que hacemos esto:
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
Nota: inicializamos la clase Animal con Lion.
La salida se verá así:
Lion here!!
Según la POO, hay muchos tipos de herencia, pero Java solo soporta algunos de ellos (multinivel y jerárquica). Para leer más al respecto, consulta este artículo.
En este ejercicio juegas un juego de rol en el que distintos tipos de luchadores pueden combatir entre sí. El juego tiene reglas diferentes para cada tipo de luchador. Nos vamos a centrar en dos tipos concretos: magos y guerreros.
Para un guerrero, estas son las reglas:
6 puntos de daño si el luchador al que ataca no es vulnerable.10 puntos de daño si el luchador al que ataca es vulnerable.Para un mago, estas son las reglas:
12 puntos de daño si preparó un hechizo de antemano.3 puntos de daño si no preparó un hechizo de antemano.Warrior
Crea una clase nueva llamada Warrior.
Esta clase debe heredar de la clase Fighter existente.
Actualiza la clase Warrior para que su método toString() describa qué tipo de luchador es.
El método debe devolver el string "Fighter is a Warrior".
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
Actualiza la clase Warrior para que su método isVulnerable() siempre devuelva false.
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
Actualiza la clase Warrior para que su método getDamagePoints(Fighter) calcule el daño que inflige un guerrero según las reglas anteriores.
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
Wizard
Crea otra clase nueva llamada Wizard.
Esta clase también debe heredar de la clase Fighter existente.
Actualiza la clase Wizard para que su método toString() describa qué tipo de luchador es.
El método debe devolver el string "Fighter is a Wizard".
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
Actualiza la clase Wizard para agregar un método llamado prepareSpell().
La clase debe recordar cuándo se llama a este método y asegurarse de que su método isVulnerable() devuelva false solo cuando haya un hechizo preparado.
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
Actualiza la clase Wizard para que su método getDamagePoints(Fighter) calcule el daño que inflige un mago según las reglas anteriores.
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
Regístrate en Exercism para aprender y dominar Java con 26 conceptos158 ejercicios y mentoría humana real, todo gratis.