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:
virtual metódust, amely olyan, mint egy hagyományos metódus, de a származtatott osztályok megváltoztathatják.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
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:
A varázslóra ezek a szabályok érvényesek:
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.
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"
Gondoskodj róla, hogy a Character.Vulnerable() metódus mindig false értéket adjon vissza.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
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();
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
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
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
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.