Sobes.tech
Назад к вопросам
Senior
6

Зачем нужен интерфейс и абстрактный класс, в чём отличия?

Компании, где спрашивали
Сбербанк

Ответ от нейросети

sobes.tech AI

Интерфейс и абстрактный класс служат для определения контрактов и базового поведения, но имеют разные цели и возможности:

  • Интерфейс описывает только набор методов и свойств без реализации (в C# 8+ возможна реализация по умолчанию). Он задаёт контракт, который должны реализовать классы. Класс может реализовывать несколько интерфейсов.

  • Абстрактный класс может содержать как абстрактные методы (без реализации), так и методы с реализацией, а также поля. Он служит базовым классом для наследования. Класс может наследоваться только от одного абстрактного класса.

Отличия:

  • Множественное наследование: интерфейсы можно реализовывать множественно, абстрактный класс — только один.
  • Возможность содержать состояние: абстрактный класс может иметь поля, интерфейс — нет (кроме статических членов).
  • Использование: интерфейс для определения поведения, абстрактный класс — для общего базового функционала.

Пример:

interface ILogger
{
    void Log(string message);
}

abstract class BaseLogger : ILogger
{
    public abstract void Log(string message);
    public void LogWithTimestamp(string message)
    {
        Console.WriteLine($"[{DateTime.Now}] {message}");
    }
}

class ConsoleLogger : BaseLogger
{
    public override void Log(string message)
    {
        Console.WriteLine(message);
    }
}