En C#, se puede definir una jerarquía de clases usando la herencia, que permite que una clase derivada (Car) herede el comportamiento y los datos de su clase padre (Vehicle). Si no se especifica un padre, la clase hereda de la clase object.
Las clases padre pueden proporcionar funcionalidad a las clases derivadas de tres maneras:
virtual, que es como un método normal pero que las clases derivadas sí pueden cambiar.abstract, que es un método sin implementación que las clases derivadas deben implementar. Una clase con métodos abstract también debe marcarse como abstract. Las clases abstractas no se pueden instanciar.El modificador de acceso protected permite acceder a un miembro de la clase padre desde una clase derivada, pero bloquea el acceso desde otras clases.
Las clases derivadas pueden acceder a los miembros de la clase padre mediante la palabra clave base.
// Inherits from the 'object' class
abstract class Vehicle
{
// Can be overridden
public virtual void Drive()
{
}
// Must be overridden
protected abstract int Speed();
}
class Car : Vehicle
{
public override void Drive()
{
// Override virtual method
// Call parent implementation
base.Drive();
}
protected override int Speed()
{
// Implement abstract method
}
}
El constructor de una clase derivada llamará automáticamente al constructor de su clase padre antes de ejecutar la lógica de su propio constructor. Se pueden pasar argumentos al constructor de una clase padre usando la palabra clave base:
abstract class Vehicle
{
protected Vehicle(int wheels)
{
Console.WriteLine("Called first");
}
}
class Car : Vehicle
{
public Car() : base(4)
{
Console.WriteLine("Called second");
}
}
Cuando más de una clase deriva de una clase base, esas dos (o más) clases suelen implementar versiones distintas de un método de la clase base. Este es un principio muy importante llamado polimorfismo. Por ejemplo, en una variación del ejemplo anterior mostramos cómo el código que usa Vehicle puede cambiar su comportamiento según qué tipo de vehículo se haya instanciado.
abstract class Vehicle
{
public abstract string GetDescription();
}
class Car : Vehicle
{
public Car()
{
}
public override string GetDescription()
{
return "Runabout";
}
}
class Rig : Vehicle
{
public Rig()
{
}
public override string GetDescription()
{
return "Big Rig";
}
}
Vehicle v1 = new Car();
Vehicle v2 = new Rig();
v1.GetDescription();
// => Runabout
v2.GetDescription();
// => Big Rig
En este ejercicio juegas a un juego de rol llamado «Wizard and Warriors», que te permite jugar como un Wizard o un Warrior.
Hay reglas distintas para los Warriors y los Wizards que determinan cuántos puntos de daño infligen.
Para un Warrior, estas son las reglas:
Para un Wizard, estas son las reglas:
En general, los personajes nunca son vulnerables. Sin embargo, los Wizards sí son vulnerables si no han preparado un hechizo.
Tienes seis tareas que trabajan con personajes Warrior y Wizard.
Sobrescribe el método ToString() de la clase Character para devolver una descripción del personaje, con el formato "Character is a <CHARACTER_TYPE>".
var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"
Asegúrate de que el método Character.Vulnerable() siempre devuelva false.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
Implementa el método Wizard.PrepareSpell() para permitir que un Wizard prepare un hechizo con antelación.
var wizard = new Wizard();
wizard.PrepareSpell();
Asegúrate de que el método Vulnerable() devuelva true si el wizard no preparó un hechizo; de lo contrario, devuelve false.
var wizard = new Wizard();
wizard.Vulnerable();
// => true
Implementa el método Wizard.DamagePoints() para devolver los puntos de daño infligidos: 12 puntos de daño cuando se ha preparado un hechizo, 3 puntos de daño cuando no.
var wizard = new Wizard();
var warrior = new Warrior();
wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12
Implementa el método Warrior.DamagePoints() para devolver los puntos de daño infligidos: 10 puntos de daño cuando el objetivo es vulnerable, 6 puntos de daño cuando no.
var warrior = new Warrior();
var wizard = new Wizard();
warrior.DamagePoints(wizard);
// => 10
Regístrate en Exercism para aprender y dominar C# con 62 conceptos178 ejercicios y mentoría humana real, todo gratis.