Почему абстракцию иногда не включают в основные принципы ООП?

«Почему абстракцию иногда не включают в основные принципы ООП?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Абстракцию часто рассматривают как общую концепцию проектирования, а не как специфический механизм языка, в отличие от инкапсуляции, наследования и полиморфизма.

Почему это происходит:

  1. Уровень абстракции: Абстракция — это высокоуровневая идея выделения существенных характеристик объекта, применимая и вне ООП (например, в процедурном программировании).
  2. Акцент на механизмах: Классическая "тройка" ООП фокусируется на конкретных языковых конструкциях для организации кода.
  3. Реализация через другие принципы: В языках вроде Java абстракция реализуется с помощью инкапсуляции (скрытие деталей в классе), наследования и полиморфизма (абстрактные классы, интерфейсы).

Пример абстракции в Java:

// Абстрактный класс определяет концепцию "Транспортное средство"
abstract class Vehicle {
    private String model;

    public Vehicle(String model) {
        this.model = model;
    }

    // Абстрактный метод — обязательное поведение для всех транспортных средств
    abstract void move();

    public String getModel() {
        return model;
    }
}

class Car extends Vehicle {
    public Car(String model) {
        super(model);
    }

    @Override
    void move() {
        System.out.println(getModel() + " едет по дороге.");
    }
}

Таким образом, абстракция — это фундаментальная цель, а инкапсуляция, наследование и полиморфизм — средства её достижения в ООП.