Sobes.tech
Junior

Co wiesz o kompozycji klas w programowaniu?

sobes.tech AI

Odpowiedź od AI

Kompozycja to relacja "zawiera" lub "część całości", w której jedna klasa (kompozyt) zawiera odwołanie do innej klasy (składnik) lub jej instancji. Cykl życia składnika jest zwykle ściśle związany z cyklem życia kompozytu. To silne powiązanie, w którym składnik nie może istnieć bez kompozytu.

Zalety kompozycji:

  • Elastyczność: Łatwiej zmieniać zachowanie, modyfikując składniki.
  • Zmniejszenie zależności: Klasy są od siebie mniej zależne w porównaniu z dziedziczeniem.
  • Ponowne użycie: Te same składniki można używać w różnych kompozytach.

Przykład: Klasa Samochód może zawierać odwołanie do klasy Silnik. Jeśli Samochód zostanie zniszczony, to i Silnik (w tym kontekście) przestaje istnieć.

class Silnik {
    // właściwości i metody silnika
}

class Samochód {
    private Silnik silnik; // kompozycja

    public Samochód() {
        this.silnik = new Silnik(); // tworzenie składnika wewnątrz kompozytu
    }

    // inne właściwości i metody samochodu
}

Różnica od agregacji: W agregacji składniki mogą istnieć niezależnie od kompozytu (słabe powiązanie). Przykład: Klasa Uniwersytet zawiera odwołania do instancji klasy Student. Studenci mogą istnieć poza uniwersytetem.

W rozwoju Android kompozycja jest aktywnie wykorzystywana, np. przy tworzeniu widoków (ViewGroup zawiera View), przy pracy z zależnościami przez Dagger/Hilt. To podejście jest preferowane w porównaniu z wielokrotnym dziedziczeniem (które w Java/Kotlin nie istnieje dla klas) i często jest bardziej elastyczne niż pojedyncze dziedziczenie.

class UserRepository(private val apiService: ApiService) {
    // UserRepository "używa" ApiService (kompozycja/agregacja)
    fun fetchUser(userId: String) {
        // apiService.getUser(userId)
    }
}