Какое основное отличие между абстрактным классом и интерфейсом в объектно-ориентированном программировании?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Абстрактный класс используют, когда нужно общее состояние, базовая реализация и общий код для потомков. Интерфейс — когда важно описать контракт без привязки к реализации. В C# один класс может наследоваться только от одного класса, но реализовывать несколько интерфейсов.
Определение:
Абстрактный класс — это базовый класс, который нельзя создать напрямую и который может содержать как абстрактные методы, так и реализованный код, поля, свойства и конструкторы.
Интерфейс — это контракт, который задаёт набор членов, которые должен реализовать класс, но сам по себе не хранит состояние объекта. Он подходит для описания поведения, а не общей реализации.
Пример использования:
Абстрактный класс удобно использовать для общей логики животных: у всех есть имя и способ издавать звук, но детали разные. Интерфейс подходит для поведения вроде "умеет летать" или "может логироваться", которое могут реализовать разные, не связанные между собой классы.
public abstract class Animal
{
public string Name { get; set; }
public void Sleep()
{
Console.WriteLine($"{Name} спит");
}
public abstract void MakeSound();
}
public interface IFlyable
{
void Fly();
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Гав");
}
}
public class Bird : Animal, IFlyable
{
public override void MakeSound()
{
Console.WriteLine("Чирик");
}
public void Fly()
{
Console.WriteLine("Птица летит");
}
}
Пояснение кода:
В примере Animal — абстрактный класс: он хранит общее свойство Name и общий метод Sleep(), который уже реализован. Метод MakeSound() объявлен как абстрактный, поэтому каждый наследник обязан дать свою реализацию.
Dog наследуется от Animal и реализует только MakeSound(). Bird тоже наследуется от Animal, но дополнительно реализует интерфейс IFlyable, потому что умение летать — это отдельное поведение, которое можно использовать и в других классах.
Если нужен только контракт, выбирают интерфейс. Если нужна общая база с частичной реализацией, выбирают абстрактный класс.
Ключевые моменты:
- Абстрактный класс может содержать состояние, конструкторы и реализованный код.
- Интерфейс задаёт контракт и обычно используется для описания поведения.
- Класс в C# наследуется только от одного базового класса, но может реализовывать несколько интерфейсов.
- Абстрактный класс выбирают для общей сущности и повторно используемой логики.
- Интерфейс выбирают для слабой связанности и гибкости архитектуры.