У 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
У цій вправі ми граємо в рольову гру «Чарівник і воїни», де можна виступати або чарівником, або воїном.
Для воїнів і чарівників діють різні правила, які визначають, скільки одиниць шкоди вони завдають.
Для воїна правила такі:
Для чарівника правила такі:
Зазвичай персонажі ніколи не бувають уразливими. Однак чарівники уразливі, якщо вони не підготували закляття.
На нас чекає шість завдань, повʼязаних із персонажами-воїнами та чарівниками.
Перевизначте метод ToString() у класі Character, щоб він повертав опис персонажа у форматі "Character is a <CHARACTER_TYPE>".
var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"
Переконайтеся, що метод Character.Vulnerable() завжди повертає false.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
Реалізуйте метод Wizard.PrepareSpell(), щоб чарівник міг заздалегідь підготувати закляття.
var wizard = new Wizard();
wizard.PrepareSpell();
Зробіть так, щоб метод Vulnerable() повертав true, якщо чарівник не підготував закляття, а інакше повертав false.
var wizard = new Wizard();
wizard.Vulnerable();
// => true
Реалізуйте метод Wizard.DamagePoints(), щоб він повертав завдані одиниці шкоди: 12 одиниць шкоди, коли закляття підготовлено, і 3 одиниці шкоди, коли ні.
var wizard = new Wizard();
var warrior = new Warrior();
wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12
Реалізуйте метод Warrior.DamagePoints(), щоб він повертав завдані одиниці шкоди: 10 одиниць шкоди, коли ціль уразлива, і 6 одиниць шкоди, коли ні.
var warrior = new Warrior();
var wizard = new Wizard();
warrior.DamagePoints(wizard);
// => 10
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.