Назад к вопросам
Junior
71
questionbank

Что ты знаешь о композиции классов в программировании?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Композиция — это связь "содержит" или "часть-целое", при которой один класс (композит) содержит ссылку на другой класс (компонент) или его экземпляры. Жизненный цикл компонента обычно тесно связан с жизнью композита. Это сильная связь, где компонент не может существовать без композита.

Преимущества композиции:

  • Гибкость: Легче менять поведение, меняя компоненты.
  • Снижение связанности: Классы меньше зависят друг от друга по сравнению с наследованием.
  • Переиспользование: Можно использовать одни и те же компоненты в разных композитах.

Пример: Класс Автомобиль может содержать ссылку на класс Двигатель. Если уничтожается Автомобиль, то и Двигатель (в этом контексте) перестает существовать.

class Engine {
    // свойства и методы двигателя
}

class Car {
    private Engine engine; // композиция

    public Car() {
        this.engine = new Engine(); // создание компонента внутри композита
    }

    // другие свойства и методы автомобиля
}

Отличие от агрегации: В агрегации компоненты могут существовать независимо от композита (слабая связь). Пример: Класс Университет содержит ссылки на экземпляры класса Студент. Студенты могут существовать и вне университета.

В Android-разработке композиция активно используется, например, при создании представлений (ViewGroup содержит View), работе с зависимостями через Dagger/Hilt. Это предпочтительный подход по сравнению с множественным наследованием (которого в Java/Kotlin нет для классов) и часто более гибкий, чем одиночное наследование.

class UserRepository(private val apiService: ApiService) {
    // UserRepository "использует" ApiService (композиция/агрегация)
    fun fetchUser(userId: String) {
        // apiService.getUser(userId)
    }
}