Kurzusok
/
C#
C#
/
Feladatok
/
Varázslók és harcosok
Varázslók és harcosok

Varázslók és harcosok

Tanulófeladat

Bevezetés

Öröklődés

C#-ban az osztályok hierarchiája öröklődéssel definiálható, amellyel egy származtatott osztály (Car) örökölheti a szülőosztálya (Vehicle) viselkedését és adatait. Ha nincs megadva szülőosztály, az osztály az object osztályból örököl.

A szülőosztályok háromféleképpen biztosíthatnak funkcionalitást a származtatott osztályoknak:

  • Definiálnak egy hagyományos metódust.
  • Definiálnak egy virtual metódust, amely olyan, mint egy hagyományos metódus, de a származtatott osztályok megváltoztathatják.
  • Definiálnak egy abstract metódust, amely implementáció nélküli metódus, és amelyet a származtatott osztályoknak implementálniuk kell. Az abstract metódusokat tartalmazó osztályt magát is abstract-ként kell megjelölni. Az absztrakt osztályokból nem lehet példányt létrehozni.

A protected hozzáférés-módosító lehetővé teszi, hogy egy szülőosztály tagját egy származtatott osztályban el lehessen érni, más osztályok elől viszont elzárja a hozzáférést.

A származtatott osztályok a base kulcsszón keresztül érik el a szülőosztály tagjait.

// 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
    }
}

A származtatott osztály konstruktora automatikusan meghívja a szülő konstruktorát, mielőtt lefuttatná a saját konstruktor logikáját. A szülőosztály konstruktorának a base kulcsszóval adhatók át argumentumok:

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

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

Amikor egynél több osztály származik egy bázisosztályból, a két (vagy több) osztály gyakran a bázisosztály egy metódusának különböző változatait valósítja meg. Ez egy nagyon fontos elv, az úgynevezett polimorfizmus. A fenti példa egy változatában például azt mutatjuk meg, hogy a Vehicle-et használó kód hogyan változtathatja meg a viselkedését attól függően, hogy milyen típusú járműből hoztunk létre példányt.

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

Utasítások

Ebben a feladatban egy „Wizard and Warriors” nevű szerepjátékkal játszol, amelyben vagy varázslóként, vagy harcosként játszhatsz.

A harcosokra és a varázslókra más-más szabályok vonatkoznak, amelyek meghatározzák, mennyi sebzéspontot okoznak.

A harcosra ezek a szabályok érvényesek:

  • 6 sebzéspontot okoz, ha a megtámadott karakter nem sebezhető
  • 10 sebzéspontot okoz, ha a megtámadott karakter sebezhető

A varázslóra ezek a szabályok érvényesek:

  • 12 sebzéspontot okoz, ha a varázsló előre előkészített egy varázslatot
  • 3 sebzéspontot okoz, ha a varázsló nem készített elő varázslatot

A karakterek általában soha nem sebezhetők. A varázslók viszont sebezhetők, ha nem készítettek elő varázslatot.

Hat részfeladat vár rád, amelyek harcos és varázsló karakterekkel dolgoznak.

1. Írj le egy karaktert

Bírd felül a Character osztály ToString() metódusát úgy, hogy a karakter leírását adja vissza, a következő formában: "Character is a <CHARACTER_TYPE>".

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

2. A karakterek alapértelmezés szerint ne legyenek sebezhetők

Gondoskodj róla, hogy a Character.Vulnerable() metódus mindig false értéket adjon vissza.

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

3. Tedd lehetővé, hogy a varázslók előkészítsenek egy varázslatot

Valósítsd meg a Wizard.PrepareSpell() metódust, hogy a varázsló előre előkészíthessen egy varázslatot.

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

4. A varázslók legyenek sebezhetők, ha nem készítettek elő varázslatot

Gondoskodj róla, hogy a Vulnerable() metódus true értéket adjon vissza, ha a varázsló nem készített elő varázslatot; egyébként false értéket adjon vissza.

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

5. Számítsd ki a varázsló sebzéspontjait

Valósítsd meg a Wizard.DamagePoints() metódust, amely a kiosztott sebzéspontokat adja vissza: 12 sebzéspont, ha elő van készítve egy varázslat, és 3 sebzéspont, ha nincs.

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

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

6. Számítsd ki a harcos sebzéspontjait

Valósítsd meg a Warrior.DamagePoints() metódust, amely a kiosztott sebzéspontokat adja vissza: 10 sebzéspont, ha a célpont sebezhető, és 6 sebzéspont, ha nem.

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

warrior.DamagePoints(wizard);
// => 10
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
C# Exercism

Készen állsz elkezdeni a(z) Varázslók és harcosok feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C# nyelvet 62 fogalom178 feladat segítségével, valódi emberi mentorálással, mindez ingyen.