Sobes.tech
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"); }
}