Mógłby mi ktoś przedstawić na czym polega kompozycja, agregacja i asocjacja.
Czy jeżeli klasa zdjęcie tworzy punkty np. Punkt punkty[200][200];
to jest to kompozycja?
Co do części pierwszej, to po co się powtarzać:
- https://pl.wikipedia.org/wiki/Agregacja_(programowanie_obiektowe)
- https://pl.wikipedia.org/wiki/Asocjacja_(programowanie_obiektowe)
- https://www.geeksforgeeks.org/association-composition-aggregation-java/
A drugie, nie, raczej niekoniecznie; kompozycją byłoby wtedy gdyby klasa Punkt
była wewnąrz klasy Zdjęcie
. Np.:
class List {
class Node {
}
head = Node()
}
Ja to zawsze upraszczałem do
- Asocjacja - klasa przyjmuje coś jako parametr metody.
- Agregacja - klasa przyjmuje coś w konstruktorze/setterze i zapisuje do pola.
- Kompozycja - klasa sama tworzy obiekt i zarządza jego czasem życia.
Nie jest to w 100% zgodne z definicjami, ale po wyjściu z uniwersytetu wystarczy do szczęścia.
@lion137: To miałem na myśli
class Punkt{
int x;
int y;
Punkt(x,y)
};
class Zdjecie{
Punkt punkty[200][200];
};
Chyba, że mówimy o czymś innym.
Z Wikipedii: "Szczególnym przypadkiem agregacji jest kompozycja, która oznacza składanie się obiektu z obiektów składowych, które nie mogą istnieć bez obiektu głównego". W ogóle jeszcze nie Stworzyłeś obiektu, ale załóżmy, że tak, to kompozycja będzie wtedy, jeśli obiekt należy do klasy i zniknie wraz ze zniknięciem obiektu go posiadającego. Żeby to zaszło, to definicja klasy Punkt
musi być w środku klasy Zdjecie
, albo go usuwać w destruktorze.
Czyli w takim przypadku powinnno się mówić agregacja ponad dzieczenie a nie kompozycja ponad dziedziczenie :D
To co jest, w jakiej klasie i jak nie ma większego znaczenia . Tu chodzi o związek logiczny pomiędzy przedmiotami - aktorami a nie techniczną implementacje. Bardziej podoba mi się określenie agregacja całkowita i częściowa, niż kompozycja i aggregacja - lepiej obrazuje, o co chodzi.
Dla przykładu:
Makrek ma bilet. <--- agregacja częściowa (Bilet może istnieć bez Marka)
Kino posiada ograniczoną ilość biletów <--- agregacja całkowita (Jeśli nie ma kina to nie ma biletu)
scibi92 napisał(a):
Czyli w takim przypadku powinnno się mówić agregacja ponad dzieczenie a nie kompozycja ponad dziedziczenie :D
Dziedziczenie to bardziej "uogólnienie"
Afish napisał(a):
Ja to zawsze upraszczałem do
- Asocjacja - klasa przyjmuje coś jako parametr metody.
- Agregacja - klasa przyjmuje coś w konstruktorze/setterze i zapisuje do pola.
- Kompozycja - klasa sama tworzy obiekt i zarządza jego czasem życia.
Nie jest to w 100% zgodne z definicjami, ale po wyjściu z uniwersytetu wystarczy do szczęścia.
Ja bym powiedział, że jest to definicja uniwersytecka, czyli regułka, która akurat najbardziej odpowiadała wykładowcy, który nie ma pojęcia o programowaniu i w ogóle o niczym, po prostu wygrzebał to gdzieś z Google. Zwłaszcza punkt pierwszy jest typowo uniwersytecki.