Что такое ООП и как оно применяется во Flutter/Dart?

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

Ответ

ООП (Объектно-Ориентированное Программирование) — это парадигма, в которой программа структурируется вокруг объектов, содержащих данные (поля) и поведение (методы). Dart — полностью объектно-ориентированный язык.

Четыре основных принципа ООП в контексте Flutter/Dart:

  1. Инкапсуляция: Сокрытие внутреннего состояния и деталей реализации объекта, предоставление публичного интерфейса.

    class BankAccount {
      // Приватное поле (инкапсуляция состояния)
      double _balance = 0.0;
    
      // Публичный интерфейс для взаимодействия
      double get balance => _balance;
    
      void deposit(double amount) {
        if (amount > 0) _balance += amount;
      }
    
      bool withdraw(double amount) {
        if (amount <= _balance) {
          _balance -= amount;
          return true;
        }
        return false;
      }
    }
  2. Наследование: Возможность создания нового класса (потомка) на основе существующего (родителя), перенимая его поля и методы.

    // Базовый класс
    class Vehicle {
      void move() => print('Двигается');
    }
    
    // Класс-наследник
    class Car extends Vehicle {
      int wheels = 4;
      @override
      void move() {
        super.move(); // Можно вызвать реализацию родителя
        print('по дороге на $wheels колесах');
      }
    }
  3. Полиморфизм: Способность объектов с одинаковым интерфейсом (например, унаследованным от одного родителя) иметь разную реализацию.

    // Используется в Flutter повсеместно, например, в виджетах
    abstract class Shape {
      void draw();
    }
    
    class Circle implements Shape {
      @override void draw() => print('Рисую круг');
    }
    class Square implements Shape {
      @override void draw() => print('Рисую квадрат');
    }
    
    void renderShapes(List<Shape> shapes) {
      for (var shape in shapes) {
        shape.draw(); // Полиморфный вызов: для Circle — один текст, для Square — другой
      }
    }
  4. Абстракция: Моделирование ключевых характеристик сущности, игнорируя нерелевантные детали. Достигается через абстрактные классы и интерфейсы.

    // Абстрактный класс задает контракт
    abstract class DataRepository {
      Future<Data> fetchData();
    }
    
    // Конкретная реализация скрывает детали (сеть, база данных)
    class NetworkRepository implements DataRepository {
      @override
      Future<Data> fetchData() async {
        // Конкретная реализация HTTP-запроса
        final response = await http.get('https://api.example.com/data');
        return Data.fromJson(response.body);
      }
    }

Во Flutter вся архитектура построена на ООП: виджеты — это классы, StatefulWidget и StatelessWidget — базовые классы для наследования, а BuildContext и Widget — ключевые абстракции.

Видео-ответы