Треки
/
C#
C#
/
Вправи
/
Чарівники та воїни
Чарівники та воїни

Чарівники та воїни

Навчальна вправа

Вступ

Успадкування

У C# ієрархію класів можна визначити за допомогою успадкування, яке дозволяє похідному класу (Car) успадковувати поведінку та дані свого батьківського класу (Vehicle). Якщо батьківський клас не вказано, клас успадковується від класу object.

Батьківські класи можуть надавати похідним класам функціональність у три способи:

  • Визначити звичайний метод.
  • Визначити virtual-метод, який схожий на звичайний метод, але похідні класи можуть його змінити.
  • Визначити abstract-метод, тобто метод без реалізації, який похідні класи повинні реалізувати. Клас з abstract-методами також має бути позначений як abstract. Абстрактні класи не можна створювати.

Модифікатор доступу protected дозволяє отримати доступ до члена батьківського класу в похідному класі, але блокує доступ з інших класів.

Похідні класи можуть отримати доступ до членів батьківського класу через ключове слово 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
    }
}

Конструктор похідного класу автоматично викличе конструктор свого батьківського класу перед виконанням логіки власного конструктора. Аргументи можна передати конструктору батьківського класу за допомогою ключового слова base:

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

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

Коли від базового класу походять більше ніж один клас, ці два (або більше) класи часто реалізують різні версії методу базового класу. Це дуже важливий принцип, який називається поліморфізмом. Наприклад, у варіації наведеного вище прикладу ми показуємо, як код, що використовує Vehicle, може змінювати свою поведінку залежно від того, який тип транспортного засобу було створено.

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

Вказівки

У цій вправі ми граємо в рольову гру «Чарівник і воїни», де можна виступати або чарівником, або воїном.

Для воїнів і чарівників діють різні правила, які визначають, скільки одиниць шкоди вони завдають.

Для воїна правила такі:

  • Завдає 6 одиниць шкоди, якщо персонаж, якого він атакує, невразливий
  • Завдає 10 одиниць шкоди, якщо персонаж, якого він атакує, уразливий

Для чарівника правила такі:

  • Завдає 12 одиниць шкоди, якщо чарівник заздалегідь підготував закляття
  • Завдає 3 одиниці шкоди, якщо чарівник не підготував закляття заздалегідь

Зазвичай персонажі ніколи не бувають уразливими. Однак чарівники уразливі, якщо вони не підготували закляття.

На нас чекає шість завдань, повʼязаних із персонажами-воїнами та чарівниками.

1. Опишіть персонажа

Перевизначте метод ToString() у класі Character, щоб він повертав опис персонажа у форматі "Character is a <CHARACTER_TYPE>".

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

2. Зробіть так, щоб персонажі типово були невразливими

Переконайтеся, що метод Character.Vulnerable() завжди повертає false.

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

3. Дозвольте чарівникам підготувати закляття

Реалізуйте метод Wizard.PrepareSpell(), щоб чарівник міг заздалегідь підготувати закляття.

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

4. Зробіть чарівників уразливими, коли закляття не підготовлено

Зробіть так, щоб метод Vulnerable() повертав true, якщо чарівник не підготував закляття, а інакше повертав false.

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

5. Обчисліть одиниці шкоди для чарівника

Реалізуйте метод Wizard.DamagePoints(), щоб він повертав завдані одиниці шкоди: 12 одиниць шкоди, коли закляття підготовлено, і 3 одиниці шкоди, коли ні.

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

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

6. Обчисліть одиниці шкоди для воїна

Реалізуйте метод Warrior.DamagePoints(), щоб він повертав завдані одиниці шкоди: 10 одиниць шкоди, коли ціль уразлива, і 6 одиниць шкоди, коли ні.

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

warrior.DamagePoints(wizard);
// => 10
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
C# Exercism

Час розпочати Чарівники та воїни?

Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.