Po co robić coś takiego:
Czlowiek x = new Pracownik();
skoro można
Pracownik x = new Pracownik();
Ktoś potrafi podać przykład dla zastosowania tego 1 ?
Po co robić coś takiego:
Czlowiek x = new Pracownik();
skoro można
Pracownik x = new Pracownik();
Ktoś potrafi podać przykład dla zastosowania tego 1 ?
Rozumiem, że Pracownik
dziedziczy po Człowiek
. A po to, że jakbyś chciał sobie przypisać do zmiennej instancję jakiegoś obiektu dziedziczącego po Człowiek
, a nie wiesz konkretnie, której klasy instancja to będzie.
Jeżeli nie narzuca Ci tego konwencja do której się stosujesz, to po nic.
Z drugiej jednak strony dużo częściej spotkasz się z
IŚmiesznyInterfejs instancja = magicznySerwis.ugabuga()
i trzymanie się najogólniejszego możliwego typu zwyczajnie skraca o jakieś trzy sekundy przyszły refaktor do w.w. formy.
Ciekawostka: w większości języków ludzie nie zastanawiają się nad takimi pierdołami i używają
var costam = samsobiewydedukuje
jak można nie wiedzieć?
Przykład:
Rejestracja użytkownika - nie wiesz czy będzie to Manager
, Prezes
, czy Papież
, a każdy z nich musi przejść podobne akcje (podanie imienia, nazwiska, NIPu, rozmiaru buta czy kolor bloku w sąsiednim województwie), więc tworzysz metody, które za argument przyjmują najbardziej ogólny typ obiektu.
@Julian_: wyobraź sobie że piszesz program który przetwarza dane z plików excela. Formatów dla excela masz kilka(naście?) -> xls, xml, xlsx... Cała reszta twojego kodu w ogóle od tego nie zależy, interesuje cię tylko żeby móc pobierać wartości cell, row, sheet.
Piszesz więc sobie jeden interfejs Workbook
który udostępnia Sheet
, ten Row
a z niego można pobrać sobie Cell
które trzyma wartość.
Teraz w jednym miejscu w kodzie, na podstawie typu pliku wybierasz czy utworzyć XMLWorkbook
czy XLSXWorkbook
czy jakiś inny podtyp Workbook ale zwracasz stąd Workbook. Cała reszta kodu bazuje na tym, że dostaje Workbook i cos z nim robi, bez względu na to jaki typ workbooka dostała.
Co więcej, możesz kiedyś dodać wsparcie dla nowego NowyTurboExcelWorkbook
a cały istniejący kod bez zmian będzie mógł z tym typem pracować o ile ta nowa klasa implementuje interfejs Workbook.
no coś by mi się przydało żeby zrozumieć obiektowość, bo R ma paradygmat funkcyjny.
Tak właściwie to w R paradygmat funkcyjny jest na poziomie js-a (funkcje wyższego rzędu == fp :D). Większy problem że system obiektów w R jest... jakie jest.
Otóż @Julian_ normalnie wyobraź sobie że masz grę. I w tej grze masz jednostki z punktami życia itp, ale jako gracz masz przypisane jednostki, masz jedną kolekcję jednostek a nie każdego możliwego typu :)
Tak samo jak masz List zamiat ArrayList możesz stwierdzić że performace będzie lepszy z LinkedList jednak bo często coś dodajesz a nie chcesz kopiować całej tablicy i jej podmieniać. Wtedy po prostu zamiast
List<T> list = new ArrayList<>();
masz
List<T> list = new LinkedList<>();
sprawnie szybko lepiej.
Albo masz aplikację do pobierania plików, masz Download reprezentujący pobieranie i HttpDownload oraz FtpDownload oraz metodę fabryczną która zwraca referencje typu Download na konkretny obiekt w zależności od URL i ten obiekt jest przekazany do ExecutorService dla którego jaki to task nie ma znaczenia, ważne że jest to runnable
A poza tym sądze że powinieneś być zbanowany :)
Julian_ napisał(a):
Ktoś potrafi podać przykład dla zastosowania tego 1 ?
Najprostsze, co mi przychodzi do głowy:
public Pracownik znajdzWolnegoPracownika(){
// ...
}
public CzlonekRodziny znajdzBialegoWRodzinie(){
// ...
}
public void ogarnijBialystok(){
Czlowiek c = znajdzWolnegoPracownika();
if(!c.jestBialy()){
c = znajdzBialegoWRodzinie(); // znajduje białego pracownika
}
wyslijCzlowiekaDoBialegostoku(c); // metoda wyslijCzlowiekaDoBialegostoku może rzucić ONRException
}
to <t> to co to jest za typ danych? bo się uczyłem dzisiaj o tym ale wstawiałem tam Stringi.
Diament oznacza typ generyczny, skoro jesteś taki obeznany w paradygmacie funkcyjnym to nie trzeba wyjaśniać dalej, wystarczy że zajrzysz jak wygląda syntax javowy.
czyli domyslny? jak nic nie wpiszesz to <T> dopisuje sobie kompilator niejawnie?
czyli domyslny? jak nic nie wpiszesz to <t> dopisuje sobie kompilator niejawnie?
Nie. Czasami tak (czasami działa magia javy i przewiduje typy w diamencie, jeżeli się da).
f :: (Num a) => a -> a
f x = 2*x+1
Taki kod jest chyba lepszy niż.
f :: Integer -> Integer
f x = 2*x+1