Віртуальні методи — це методи базового класу, які можна перевизначити у похідних класах за допомогою ключового слова override.
Вони дозволяють створювати поведінку, яка змінюється залежно від типу об’єкта під час виконання програми.
virtual.override.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 |
Віртуальні методи дозволяють змінювати поведінку методів у похідних класах, залишаючи єдиний інтерфейс виклику через базовий клас. Це робить код гнучким, зручним для розширення та підтримки.