Sobes.tech
Назад к вопросам
Junior — Middle
89

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

Компании, где спрашивали
РосатомРосатом

Ответ от нейросети

sobes.tech AI

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

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

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

Основные отличия:

  1. Наследование: Класс может наследоваться только от одного абстрактного класса, но может реализовывать множество интерфейсов.
  2. Состояние: Абстрактный класс может хранить состояние, интерфейс — нет.
  3. Назначение: Абстрактный класс используется, когда есть общая реализация и состояние, а интерфейс — для определения контракта без реализации.

Пример на Java:

abstract class Animal {
    abstract void makeSound();
    void breathe() {
        System.out.println("Breathing...");
    }
}

interface Flyable {
    void fly();
}

class Bird extends Animal implements Flyable {
    void makeSound() {
        System.out.println("Chirp");
    }
    public void fly() {
        System.out.println("Flying");
    }
}

Здесь Animal — абстрактный класс с частичной реализацией, а Flyable — интерфейс, определяющий способность летать.