Citat:
negyxo:
Ne, zadnjih par komentara se odnosi na to kako strukturalni type sistem ti omogucuje da implementiras interface on-the-fly.
Zloupotreba se odnosi na onaj deo koji sam opisao u drugom postu, kada uzmes i za svaku klasu namestis interface. To znaci, ako planiras da tvoj code koristis samo interno, i nema neki public deo, i nemas nameru nesto da prosirujes, onda je deklaracija interfejsa cist noise. Ako imam recimo funkciju koji kaze da prima interfejs, recimo neki Converter, i taj converter ima jednu implementaciju u celom projektu, i nikad nece imati vise od jedne, i to vazi za 95% interfejsa, onda je to nesnosni noise. Kada vidim da funkcija prima interfejs, gde se implementacija nalazi? Jel moram ja da ga implementiram? Pa cim si definisao kao interfejs onda dajes do znanja da bi trebalo da implementiras, ali posto to u stvari nije prava upotreba interfejsa, onda samo treba da ides i da pretrazujes projekat koja to klasa implementira interface ili da imas neki dependency injection container (opet silovanje, container koji uvek vraca istu implementaciju za isti interfejs, ali ono, mozda zatreba jednog dana....).
Pokušavam da razumem tvoj ugao gledanja ali mi baš ne ide. Možda zato što nemam neko isksutvo rada u C++ i Javi (kad god sam probao odbijao me je nesnosan utisak skučenosti i ograničenja).
Pazi, svaki pristup ima opravdanje jer da nema ne bi postojao. Svaki pristup može da se ne koristi, da se koristti, da se preterano koristi i da se koristi naopako. A to opet zavisi od ličnih afiniteta, navika, načina razmišljanja, umešnosti i iskustva i sličnog.
Meni je recimo "on the fly" (kreiranja tipova, strutkura, funckija...) naopak pristup (neću ići dotle da ga nazovem fašističkim ali ga smatram jednom od većih grozota) a ti ga voliš. Daleko bilo da ne koristim "dinamički" pristup. Nekad se on ne može izbeći i ume znatno da uporosti stvari ali u svemu treba imati mere.
Takođe tvoj omiljen pristup nasleđivanja više klasa meni ne leži (koncept mi je simpatičan ali mi ne pije vodu u realnoj primeni). Naravno da nisam ja u pravu kao što nisi ni ti upravu. Svako od nas treba da radi kako mu pogoduje. Klali bismo se samo ako bismo radili na istom projektu :)
Naravno da je pogrešno preterivati u svemu pa i u upotebi interfejsa. Interfejs se definiše kada je potreban i implementira onda kada je potreban. Niko tebe ne prisilajva da implementiraš odeđeni interfejs osim ako ne treba da komuniciraš sa nekom klasom koja zahteva određeni interfejs. Upravo taj interfejs omogućava da ta klasa komunicira sa tvojom klasom ne znajući o njoj ništa više od tog interfejsa. Interfejs upravo tome i služi, da definiše protokol po kome klase komuniciraju ne ulazeži u samu strukturu tih klasa.
Nije mi jasno na šta misliš kada kažeš da ti je problem da nađeš ko implementira neki interfejs. Nema šta ko da ga implementira, implementiraš ga ti na tvojoj klasi ako ona treba da komunicira sa drugom klasom preko tog interfejsa.
Često kada objašnajvam interfejse navodim primer iz prakse, primer sa komponetnama grafičkog intefejsa koje prikazuju tabele. To su na primer grid, combo box, list, box, meni i slične komponente.
Nisu one bez razloga napravljene uz upotrebu interfejsa (u C# to su konkretno IEnumerable i IEnumerator) jer na taj način je omogućeno da one prikažu bilo kakve podatke bez obira u kakvim su objektima. Dakle, one će prihvatiti i prikazati podatke koji imaju IEnumerable intefejs i neće uopšte ulaziti da li se radi o standardnoj tabeli, nekoji listi, koilekciji ili možda čak i sasvim custom klasi. Sve dok prosleđeni podatak ima implementiran interfejs podaci će biti prikazani u bilo kojoj grafičkoj komponenti koja prikazuje podtke koje su u nekakvom tabelarnom obliku.
Ne odnosi se iEnumerable samo na grafičke komponente. Recimo ako napraviš klasu koja implementira iEnumerable interfejs moći ćeš da je obrađuješ i sa foreach. Ako to ne uradiš, onda ćeš morati da protrčavaš kroz sve elemente u svojoj strukturi ručno, na neki svoj način.
Zaista ne vidim problem s aimplementacijominterfejsa. Njega implementiraš samo ako ti je potrebno. Niko te ne uslovljava da implementiraš interefejs ako se on neće koristiti. Implementacije interfejsa se nasleđuju tako da ako implementiraš interfejs na nekoj baznoj kasi sve klse koje su naslednici će takođe koristiti tu implementaciju.