Назад Вперед Зміст

Віртуальні методи у C#

Віртуальні методи — це методи базового класу, які можна перевизначити у похідних класах за допомогою ключового слова override. Вони дозволяють створювати поведінку, яка змінюється залежно від типу об’єкта під час виконання програми.


Основні кроки використання віртуальних методів

  1. У базовому класі метод позначається як virtual.
  2. У похідному класі метод перевизначається за допомогою override.
  3. При виклику через посилання на базовий клас виконується перевизначена версія методу.

Приклад: Клас Triangle та його нащадки

Базовий клас Triangle містить методи GetArea() та GetPerimeter(). Його наслідують три класи: RightTriangle (прямокутний), EquilateralTriangle (правильний), ScaleneTriangle (довільний).


using System;

class Triangle
{
    public double A { get; }
    public double B { get; }
    public double C { get; }

    public Triangle(double a, double b, double c)
    {
        A = a; B = b; C = c;
    }

    public virtual double GetPerimeter()
    {
        return A + B + C;
    }

    public virtual double GetArea()
    {
        double p = GetPerimeter() / 2;
        return Math.Sqrt(p * (p - A) * (p - B) * (p - C)); // Формула Герона
    }
}

class RightTriangle : Triangle
{
    public RightTriangle(double a, double b) 
        : base(a, b, Math.Sqrt(a*a + b*b)) { }

    public override double GetArea()
    {
        return (A * B) / 2;
    }
}

class EquilateralTriangle : Triangle
{
    public EquilateralTriangle(double side) 
        : base(side, side, side) { }

    public override double GetArea()
    {
        return (Math.Sqrt(3) / 4) * A * A;
    }
}

class ScaleneTriangle : Triangle
{
    public ScaleneTriangle(double a, double b, double c) 
        : base(a, b, c) { }
    // Використовує базову реалізацію
}

class Program
{
    static void Main()
    {
        Triangle t1 = new RightTriangle(3, 4);
        Triangle t2 = new EquilateralTriangle(5);
        Triangle t3 = new ScaleneTriangle(3, 5, 6);

        Console.WriteLine("Прямокутний: площа = " + t1.GetArea() + ", периметр = " + t1.GetPerimeter());
        Console.WriteLine("Правильний: площа = " + t2.GetArea() + ", периметр = " + t2.GetPerimeter());
        Console.WriteLine("Довільний: площа = " + t3.GetArea() + ", периметр = " + t3.GetPerimeter());
    }
}

Таблиця тестування

Вхідні дані та результати роботи програми:

Тип трикутника Сторони (A, B, C) Площа Периметр
Прямокутний 3, 4, 5 6 12
Правильний 5, 5, 5 ≈ 10.825 15
Довільний 3, 5, 6 ≈ 7.483 14

Висновок

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

Назад Вперед Зміст