Sobes.tech
Middle
120
questionbank

В каких случаях следует использовать интерфейс, а в каких — абстрактный класс?

Answer from AI

sobes.tech AI

Используйте интерфейсы для определения контракта поведения, который могут реализовывать классы. Это позволяет достичь полиморфизма и ослабляет связанность между классами. У класса может быть множество интерфейсов, но только один базовый класс.

Используйте абстрактные классы, когда у вас есть общая реализация части функциональности и вы хотите предоставить базовую структуру для дочерних классов. Абстрактные классы могут содержать абстрактные и обычные методы, а также поля. Подходят, когда требуется наследование "является".

Признак Интерфейс Абстрактный класс
Множественное наследование Да Нет
Наличие реализации Нет (до .NET 8 с default interface methods) Да, частичная или полная
Поля Нет Да
Конструкторы Нет Да
Тип отношений "может сделать" ("has-a") "является" ("is-a")

Пример использования интерфейса:

// Определяем контракт для объектов, умеющих летать
public interface IFlyable
{
    void Fly();
}

// Класс самолета реализует интерфейс IFlyable
public class Airplane : IFlyable
{
    public void Fly()
    {
        // Реализация полета самолета
        Console.WriteLine("Самолет летит");
    }
}

// Класс птицы также реализует интерфейс IFlyable
public class Bird : IFlyable
{
    public void Fly()
    {
        // Реализация полета птицы
        Console.WriteLine("Птица летит");
    }
}

Пример использования абстрактного класса:

// Абстрактный класс животного с общей реализацией дыхания
public abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("Животное дышит");
    }

    // Абстрактный метод, который должны реализовать дочерние классы
    public abstract void MakeSound();
}

// Конкретный класс собаки, наследующийся от Animal
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Гав!");
    }
}

// Конкретный класс кошки, наследующийся от Animal
public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Мяу!");
    }
}