Sobes.tech
Back to questions
Junior — Middle
73

Какое отличие в поведении и использовании абстрактных классов и интерфейсов в объектно-ориентированном программировании?

Answer from AI

sobes.tech AI

Абстрактные классы и интерфейсы — два разных механизма для описания контрактов и поведения в объектно-ориентированном программировании, но они имеют ключевые отличия:

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

  • Интерфейс описывает только набор методов (контракт), которые должен реализовать класс. Интерфейсы не содержат реализации (за исключением default-методов в некоторых языках) и не имеют состояния.

Отличия в использовании:

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

Пример на C#:

abstract class Animal {
    public abstract void MakeSound();
    public void Sleep() {
        Console.WriteLine("Sleeping");
    }
}

interface IFlyable {
    void Fly();
}

class Bird : Animal, IFlyable {
    public override void MakeSound() {
        Console.WriteLine("Chirp");
    }
    public void Fly() {
        Console.WriteLine("Flying");
    }
}

Здесь Animal — абстрактный класс с частичной реализацией, а IFlyable — интерфейс, который может реализовать любой класс, независимо от иерархии.