Citat:
veljaradenkovic:
Upcasting je castovanje izvedene klase u generalniji bazni tip.
Nikako ne mora da bude znak lose isprojektovanog softvera.
naravno.. lapsus lingua, mislio sam na downcast, tj castovanje reference generalnog (baznog) tipa, nazad u izvedenu klasu..
znači, ovo nije primer upcasta već downcasta, pošto klasa ArrayList
implementira (u javinom žargonu) interfejs List, odnosno
nasleđuje List (u klasičnom OOP/C++ žargonu). zato se može reći da se pri kreiranju i dodeljivanju
List lista = new ArrayList(); radi upcast, a u onoj metodi radi downcast..
(a downcast već može da bude znak..)
Citat:
BlueIce:
-zombie-, pošto tek počinjem da učim Javu, da li bi mogao da mi pojasniš zašto je upcasting loš, i kako je ovo trebalo da se uradi?
greška (vidi gore), a za ovaj konkretan slučaj sam rekao da je verovatno ok, ali da downcasting često može da znači loše projektovanje..
tj, u ovom konkretnom slučaju downcast poništava poJentu korišćenja List interfejsa. interfejs se koristi (između ostalog) da bi kasnije u razvoju projekta, kada otkriješ da je recimo jedna klasa usko grlo, možeš zameniti bilo kojom drugom klasom koja implementira isti interfejs, a da ne menjaš ni jednu liniju ostatka koda..
nasuprot tome, ako bi u ovom primeru poželeo da umesto ArrayList koristš Vector, morao bi da promeniš i liniju gde si listu downcastovao u ArrayList, jer lista više nije tog tipa..
rešenje bi možda bilo (pomalo napamet, bez uvida u ostatak projekta) da se napravi novi interfejst CloneableList koji bi nasledio i List i Cloneable, i plus dodao javni metod clone() (pošto Cloneable ne sadrži taj metod, već se ponaša čisto kao "flag").
Citat:
veljaradenkovic:
Sad zamisli ovo; on je deklarisao varijablu list tipa List, kreirao novi objekat tipa ArrayList i dodelio ga varijabli list. Onda se izvrsi druga metoda (pre ove sporne) i kaze list = new Pera(); kako ces sad da kloniras peru kad nece.
upravo je to jedan od primera zašto downcast može biti znak lošeg dizajna..
Citat:
BlueIce:
bez obzira što je inicijalizovan preko new ArrayList() to nema veze jer će kreirani objekat i referenca na isti biti tipa List što je u stvar interfejs, da li sam u pravu?
delimično. kreirani objekat može biti "tipa" samo neke klase (koja implementira neki interfejs), a ne samog interfejsa. sa druge strane, referenca, odnosno varijabla koja pokazuje na taj objekat može i hoće biti tipa List.