Back to questions
Junior — Middle
63
Как отличить использование абстрактного класса от реализации интерфейса в объектно-ориентированном программировании?
Answer from AI
sobes.tech AI
Абстрактный класс и интерфейс — оба служат для определения контракта, но имеют разные цели и особенности:
Абстрактный класс:
- Может содержать реализацию методов (как абстрактных, так и с телом).
- Может содержать поля и конструкторы.
- Позволяет наследование только от одного класса (одинарное наследование).
- Используется, когда есть общая реализация и поведение, которое нужно разделить между классами.
Интерфейс:
- Содержит только объявления методов, свойств, событий (в новых версиях C# могут быть дефолтные реализации, но это расширение).
- Не содержит полей и конструкторов.
- Класс может реализовывать несколько интерфейсов.
- Используется для определения набора возможностей, которые класс должен реализовать, без навязывания реализации.
Когда использовать:
- Если нужно задать общий базовый класс с частичной реализацией — абстрактный класс.
- Если нужно определить набор функций, которые могут быть реализованы разными классами, не связанных иерархией — интерфейс.
Пример:
public abstract class Animal
{
public abstract void MakeSound();
public void Sleep() { Console.WriteLine("Sleeping"); }
}
public interface IFlyable
{
void Fly();
}
public class Bird : Animal, IFlyable
{
public override void MakeSound() { Console.WriteLine("Chirp"); }
public void Fly() { Console.WriteLine("Flying"); }
}