Jaki jest sens tak kiełbasić przy tworzeniu obiektów klas?

0

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 ?

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.

1

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
2

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.

1

@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.

0

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.

0

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 :)

0
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
}
0

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.

0

czyli domyslny? jak nic nie wpiszesz to <T> dopisuje sobie kompilator niejawnie?

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1