Назад к вопросам
Senior
10
Расскажи про интерфейсы и абстрактные классы: когда применять одно, когда другое, и особенности наследования
Компании, где спрашивали
Позитив Технолоджис
Ответ от нейросети
sobes.tech AI
Интерфейсы и абстрактные классы — это инструменты для описания контрактов и базового поведения в объектно-ориентированном программировании, но они имеют разные цели и особенности.
Интерфейсы:
- Определяют только сигнатуры методов и свойств, без реализации.
- Используются для задания обязательного набора методов, которые класс должен реализовать.
- Позволяют реализовать множественное наследование контрактов (в языках, где это поддерживается).
- Хорошо подходят для описания ролей или возможностей, которые могут быть реализованы разными классами.
Абстрактные классы:
- Могут содержать как абстрактные методы (без реализации), так и конкретные методы с реализацией.
- Используются для создания базового класса с общим поведением и обязательными методами для наследников.
- Поддерживают наследование реализации и состояние (поля).
- Обычно применяются, когда есть общая логика, которую нужно разделить между классами.
Когда применять:
- Если нужно задать только контракт без реализации — интерфейс.
- Если нужно задать общий базовый класс с частичной реализацией — абстрактный класс.
Особенности наследования:
- Класс может реализовывать несколько интерфейсов.
- Класс может наследоваться только от одного абстрактного класса (в большинстве языков).
Пример на C#:
interface ILogger
{
void Log(string message);
}
abstract class BaseLogger : ILogger
{
public abstract void Log(string message);
public void LogError(string error) {
Log("ERROR: " + error);
}
}
class ConsoleLogger : BaseLogger
{
public override void Log(string message) {
Console.WriteLine(message);
}
}
Здесь интерфейс задаёт контракт, абстрактный класс даёт частичную реализацию, а конкретный класс реализует детали.