Parcours
/
C#
C#
/
Exercices
/
Sorciers et guerriers
Sorciers et guerriers

Sorciers et guerriers

Exercice d'apprentissage

Introduction

Héritage

En C#, on peut définir une hiérarchie de classes à l'aide de l'héritage, ce qui permet à une classe dérivée (Car) d'hériter du comportement et des données de sa classe parente (Vehicle). Si aucune classe parente n'est spécifiée, la classe hérite de la classe object.

Les classes parentes peuvent fournir des fonctionnalités aux classes dérivées de trois manières :

  • Définir une méthode normale.
  • Définir une méthode virtual, qui est comme une méthode normale mais que les classes dérivées peuvent modifier.
  • Définir une méthode abstract, qui est une méthode sans implémentation que les classes dérivées doivent implémenter. Une classe avec des méthodes abstract doit également être marquée comme abstract. Les classes abstraites ne peuvent pas être instanciées.

Le modificateur d'accès protected permet d'accéder à un membre de la classe parente depuis une classe dérivée, mais bloque l'accès depuis les autres classes.

Les classes dérivées peuvent accéder aux membres de la classe parente via le mot-clé 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
    }
}

Le constructeur d'une classe dérivée appelle automatiquement le constructeur de sa classe parente avant d'exécuter la logique de son propre constructeur. On peut passer des arguments au constructeur d'une classe parente à l'aide du mot-clé base :

abstract class Vehicle
{
    protected Vehicle(int wheels)
    {
        Console.WriteLine("Called first");
    }
}

class Car : Vehicle
{
    public Car() : base(4)
    {
        Console.WriteLine("Called second");
    }
}

Lorsque plusieurs classes dérivent d'une classe de base, ces deux (ou plus) classes implémentent souvent des versions différentes d'une méthode de la classe de base. C'est un principe très important appelé polymorphisme. Par exemple, dans une variante de l'exemple ci-dessus, on montre comment du code utilisant Vehicle peut changer de comportement selon le type de véhicule qui a été instancié.

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

Instructions

Dans cet exercice, tu joues à un jeu de rôle nommé « Wizard and Warriors », qui te permet d'incarner soit un Wizard, soit un Warrior.

Les règles diffèrent entre les Warriors et les Wizards pour déterminer le nombre de points de dégâts qu'ils infligent.

Pour un Warrior, les règles sont les suivantes :

  • Infliger 6 points de dégâts si le personnage qu'il attaque n'est pas vulnérable
  • Infliger 10 points de dégâts si le personnage qu'il attaque est vulnérable

Pour un Wizard, les règles sont les suivantes :

  • Infliger 12 points de dégâts si le Wizard a préparé un sort à l'avance
  • Infliger 3 points de dégâts si le Wizard n'a pas préparé de sort à l'avance

En général, les personnages ne sont jamais vulnérables. Cependant, les Wizards sont vulnérables s'ils n'ont pas préparé de sort.

Tu as six tâches à réaliser avec les personnages Warrior et Wizard.

1. Décris un personnage

Redéfinis la méthode ToString() de la classe Character pour renvoyer une description du personnage, au format "Character is a <CHARACTER_TYPE>".

var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"

2. Fais en sorte que les personnages ne soient pas vulnérables par défaut

Assure-toi que la méthode Character.Vulnerable() renvoie toujours false.

var warrior = new Warrior();
warrior.Vulnerable();
// => false

3. Permets aux Wizards de préparer un sort

Implémente la méthode Wizard.PrepareSpell() pour permettre à un Wizard de préparer un sort à l'avance.

var wizard = new Wizard();
wizard.PrepareSpell();

4. Rends les Wizards vulnérables lorsqu'ils n'ont pas préparé de sort

Assure-toi que la méthode Vulnerable() renvoie true si le Wizard n'a pas préparé de sort, et false sinon.

var wizard = new Wizard();
wizard.Vulnerable();
// => true

5. Calcule les points de dégâts d'un Wizard

Implémente la méthode Wizard.DamagePoints() pour renvoyer les points de dégâts infligés : 12 points de dégâts lorsqu'un sort a été préparé, 3 points de dégâts sinon.

var wizard = new Wizard();
var warrior = new Warrior();

wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12

6. Calcule les points de dégâts d'un Warrior

Implémente la méthode Warrior.DamagePoints() pour renvoyer les points de dégâts infligés : 10 points de dégâts lorsque la cible est vulnérable, 6 points de dégâts sinon.

var warrior = new Warrior();
var wizard = new Wizard();

warrior.DamagePoints(wizard);
// => 10
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
C# Exercism

Prêt à commencer Sorciers et guerriers ?

Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.