Mam klasę bazową: KlasaBaza (z polami nazwa, data), z niej dziedziczą dwie inne klasy, Klasa1 oraz Klasa2. Klasy dziedziczące mają prócz pól "nazwa" i "data" pole "strumien" dla Klasa1 i "kodowanie" dla Klasa2.
Stworzyłem ArrayList<KlasaBaza>, w której przechowuje obiekty tych trzech klas.
Problem pojawił się, gdy chciałem posortować obiekty. Bez problemu sortuję po "nazwa" i "data", ale gdy chcę jeszcze, by obiekty były posortowane po "kodowanie" dla Klasy2 i po "strumien" dla Klasa1 nic nie wychodzi.
I nie powinno! Bo z poziomu klasy bazowej ich nie widać. Wyobraź sobie że masz w tej liście obiekty obu typów. Jak by to mialo niby zadziałać jakbyś chciał sortować po którymś z tych pól?
Ok, ale jak tego w takim razie dokonać ??
Ale co chcesz dokonać konkretnie?
napisz własny komparator który dostarczysz z listą obiektów do Collections.sort() np.
Collections.sort(list, new Comparator<klasabaza>() {
@Override
public int compare(klasabaza o1, klasabaza o2) {
// .... porownywanie obiektow
return jakisWynikPorownania;
}
});
Do Shalon:
po prostu chcę by PlikTekstowy i PlikBinarny sortował się jeszcze po 'kodowanie' i 'skrot'. (To one dziedziczą po plik)
http://scr.hu/16s7/spoec
Do Zarek:
zrobiłam coś takiego, ale .... to nie działa ;p
http://scr.hu/16s7/c09vv
@Xender tu Ci powiedziano, czemu tak nie zrobisz w układzie, który masz:
Shalom napisał(a):
I nie powinno! Bo z poziomu klasy bazowej ich nie widać.
Jaśniej się nie da. :)
To chcecie mi powiedzieć, że NIC nie mogę z tym zrobić, nic a nic? Musi to zostać nieposortowane?
Dopytuję, by mieć pewność, że nie ma żadnego innego sposobu?
Jest. W klasie bazowej trzymaj wszystkie pola... ;-)
Nie mogę, bo to psuje ideę dziedziczenia. Plik ma nie mieć tych pól ...
Xender napisał(a):
Nie mogę, bo to psuje ideę dziedziczenia. Plik ma nie mieć tych pól ...
Użyj operatora instanceof w komparatorze, który sprawdzi czy oba porównywane obiekty są reprezentantami tej samej klasy dziedziczącej. Jeśli tak, to zrób rzutowanie i je porównaj. To bardzo brzydkie rozwiązanie i należy unikać takich rzeczy, bo taki kod jest trudniej modyfikowalny - musisz pamiętać o zmianach w komparatorze, psuje przejrzystość kodu i ogólnie bardzo niepolecane rozwiązanie, ale skoro się uparłeś...
Dziedziczenie nie jest jakąś regułą, której należy się trzymać, ba - w wielu przypadkach, takich jak ten, należy go unikać i używać np. kompozycji - klasy "dzieci" powinny zawierać w sobie obiekt klasy "rodzica" jako jedno z pól, a nie rozszerzać tylko dlatego, że jest to możliwe.
Tu masz jak tego użyć:
http://en.wikibooks.org/wiki/Java_Programming/Keywords/instanceof
Ale silnie doradzam przemyślenie struktury tego projektu.
@Xender ale jak to sortowanie miałoby działać? POMYŚL! Jak będę miał w liście plik binarny i nie binarny i sortuje po kodowaniu to jak chcesz te dwa pliki ze sobą porównać skoro jeden ma takie pole a drugi go nie ma?
Przy odrobinie refleksji wszystko się da: http://ideone.com/pa1pBv
Hue, hue :P
Sortowanie najpierw po polu nazwa, potem po typie, potem po ekstra polach.