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

Інтерфейси у C# — в порівнянні з абстрактними класами

Ця сторінка пояснює, як інтерфейси розвивають ідеї абстрактних класів: дають контракт (набір методів), який можуть реалізувати різні класи. Нижче — приклади, таблиці тестування та порівняння.


Приклад: інтерфейс IFigure

Інтерфейс IFigure визначає методи GetArea() та GetPerimeter(). Класи Triangle і Circle реалізують цей інтерфейс.


using System;

interface IFigure
{
    double GetArea();
    double GetPerimeter();
}

class Triangle : IFigure
{
    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 double GetArea()
    {
        double p = GetPerimeter() / 2;
        return Math.Sqrt(p * (p - A) * (p - B) * (p - C)); // Герон
    }

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

class Circle : IFigure
{
    public double Radius { get; }

    public Circle(double radius) => Radius = radius;

    public double GetArea() => Math.PI * Radius * Radius;

    public double GetPerimeter() => 2 * Math.PI * Radius;
}

class Program
{
    static void Main()
    {
        IFigure f1 = new Triangle(3, 4, 5);
        IFigure f2 = new Circle(5);

        Console.WriteLine($"Трикутник: площа = {f1.GetArea():F3}, периметр = {f1.GetPerimeter():F3}");
        Console.WriteLine($"Коло: площа = {f2.GetArea():F3}, довжина = {f2.GetPerimeter():F3}");
    }
}

SVG-діаграма: Інтерфейс ↔ Класи

Діаграма: Інтерфейс і реалізації Інтерфейс IFigure та класи Triangle і Circle, що реалізують інтерфейс. Стрілки від класів до інтерфейсу підписані "реалізує". IFigure + GetArea() : double + GetPerimeter() : double Triangle A, B, C Circle Radius реалізує реалізує Пояснення: Сині стрілки — реалізація інтерфейсу Класи мають власні поля та реалізації
Пояснення: стрілка від класу до інтерфейсу означає, що клас реалізує інтерфейс (implements). Це дає змогу працювати з обʼєктами через тип інтерфейсу (поліморфізм).

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

Вхідні дані та очікувані результати:

Фігура Параметри Площа Довжина границі
Triangle 3, 4, 5 6.000 12.000
Circle R = 5 ≈ 78.540 ≈ 31.416

Порівняння: Абстрактний клас vs Інтерфейс

Критерій Абстрактний клас Інтерфейс
Ключове слово abstract class interface
Наявність полів Може мати поля (стан) Не може мати полів (до C# 8.0)
Реалізація методів Може містити як реалізовані, так і абстрактні методи Методи без реалізації (за замовчуванням); з C# 8.0 можливі реалізації за замовчуванням
Успадкування / Реалізація Клас може успадкувати лише один клас Клас може реалізовувати багато інтерфейсів
Модифікатори доступу Може мати різні модифікатори доступу Методи інтерфейсу публічні за замовчуванням
Призначення Визначає спільну поведінку та/або стан Визначає лише контракт (поведінку)

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