Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
MelkorNemesis
Založen: 27. 10. 2007 Příspěvky: 12
|
Zaslal: 9. únor 2008, 16:22:49 Předmět: Objektové rozhraní |
|
|
Ahoj, k čemu slouží objektové rozhraní?
na http://php.interval.cz/clanky/objektove-rozhrani/ sem se dozvěděl akorát snad to, že si v interfacu definuju metody, které můžu použít v třídě, kde ho implementuji, když je tam nějaká cizí, skončí to chybou...
ale k čemu opravdu interface slouží?
*edit: mluvime o PHP |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 9. únor 2008, 16:34:05 Předmět: |
|
|
melkore si delas srandu ne? - proc se bavis o PHP??? - bez a najdi si principy objektoveho programovani a pochopis k cemu interface je a nebo se proste zeptej na tom IRC kdyz tam jsi |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. únor 2008, 20:00:13 Předmět: |
|
|
rezna: zbytečně tvrdá reakce, najdou se tu i horší dotazy, na který se odpovídá
MelkorNemesis:
v PHP nedělám, ale obecně slouží Interface k tomu, abys mohl definovat jednotné rozhraní pro více tříd, které ho mají. V běžném životě má například auto pro uživatele stejné rozhraní (volant, pedály, ...), ale už nezáleží na tom, kdo to auto vyrobil, co se s ním dá vozit, jakou má barvu a jak rychle jezdí.
A v programování je to stejné, interface slouží k tomu, aby nějaký objekt mohl používat jiný, bez jeho celé znalosti (z čeho byl odvozen, kým byl naprogramován, ve které knihovně leží). Příkladem může být nějaký interface
"IKreslič" s metodou kresli(). Nezajímá tě, co v ní je, ale při kreslení víš, že když zavoláš kresli(), stane se to.
Částečně se tím dá substituovat vícenásobná dědičnost (jako je v C++), je to bezpečný a dobře se s tím pracuje. Více si najdi. Už tak sem se docela trapně rozepsal :) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
MelkorNemesis
Založen: 27. 10. 2007 Příspěvky: 12
|
Zaslal: 10. únor 2008, 13:04:46 Předmět: |
|
|
diky semo |
|
Návrat nahoru |
|
|
DOMM
Založen: 12. 03. 2008 Příspěvky: 5 Bydliště: Morava
|
Zaslal: 12. březen 2008, 23:50:36 Předmět: |
|
|
Ja bych se chtel zeptat, zda jde nejakym zpusobem vyvolat metodu instancí, ktere dedi z urciteho rozhrani (neznam zadny odkaz na instanci, vim jen ze implementuji urcite rozhrani)
Priklad: Chtel bych po sobe pekne uklidit, tak vyvolam metodu, která se ozve (udela co je treba) z kazde instance, aniz bych na nejakou instanci mel jakykoliv odkaz.
Jde to? |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. březen 2008, 10:12:08 Předmět: |
|
|
Buď bych to "uklízení" dal do destruktoru objektu (což je tak jako tak správné), takže by se to někdy zavolalo. Nebo bych tu metodu dal i do toho rozhraní. Rozhraní od sebe mohou také dědit, takže můžeš třeba mít nějaké základní rozhraní s metodou Uklid() a z toho podědit další rozhraní s dalšíma metodama. Nehledě na to že třída může implementovat více rozhraní, takže může být zároveň "IUklizec" a zároveň něco jinýho.
A co bych nedoporučoval, je následující "hack". Rozhraní může mít metodu VratInstanci(), která ti předá odkaz na instanci a tam pak můžeš volat co chceš. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
DOMM
Založen: 12. 03. 2008 Příspěvky: 5 Bydliště: Morava
|
Zaslal: 13. březen 2008, 10:53:59 Předmět: |
|
|
Jo, s tím rozhraním mi to je jasný.
Programuju v .NETu, a tam je lepsi destruktor nepouzivat. Zpomaluje se pak GC. Prave je lepsi implementovat metodu Dyspose (ted nevim v jakym je rozhrani) a uklid zajistit v te metode. GC pak uklidi instanci jednim tahem (jinak by se odstranila az po druhym cisteni).
A me prave zajimalo, kdyz koncim aplikaci, tak jak zavolat u vsech tu metodu.
Pritom vim, ze vsechny moje objekty tu metodu maji.
Me prave napadlo, ze bych to udelal pres udalosti, aby ty objekty zareagovaly tak ze se sami uklidi. A nebo si ukladat odkaz na objekt v nejakem dalsim objektu.
Ale myslim ze by to mohlo jit i jednoduseji.. |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 13. březen 2008, 11:43:02 Předmět: |
|
|
pletes jabka a hrusky
rozhrani je IDisposable a je urceno k tomu aby se explicitne uklidily unmanaged zalezitosti
a co se tyce toho kdyz mas v ruce referenci pretypovanou na dany interface tak preci neni nic jednodussiho nez operator "as" ne? a pretypovat si to na IDisposable.
ale pokud to chces volat na ryze managed objekty vracis se do doby kamenne a .NET pro tebe ztraci smysl. krasa je prave v tom ze toto resit nemusis a GC to poresi sam. |
|
Návrat nahoru |
|
|
DOMM
Založen: 12. 03. 2008 Příspěvky: 5 Bydliště: Morava
|
Zaslal: 13. březen 2008, 13:35:36 Předmět: |
|
|
No dobre a co kdyz nemas ty odkazy na instance (nemuzes pouzit zadny "as"), existuje pak nejaka metoda, ktera by mi vratila treba pole objektů? |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. březen 2008, 14:05:43 Předmět: |
|
|
...ale můžeš "přetypovat" pomocí as jedno rozhraní na jiné rozhraní, třeba jak píše rezna IDisposable. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 13. březen 2008, 14:16:01 Předmět: |
|
|
]semo[ napsal: |
...ale můžeš "přetypovat" pomocí as jedno rozhraní na jiné rozhraní, třeba jak píše rezna IDisposable. |
uz to chapu - on nema zadnou instanci - ma nekde deklarovane ruzne lokalni promenne a chce je nucene odstranit kdyz vi ze konci aplikaci
DOMM: a co takhle si drzet seznam vsech objektu v nejakem poli a tudiz udelat si vlastni GC nad GC .NETu
porad ale stejne nechapu kam miris a co je tim tristnim problemem GC v .NETu |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 13. březen 2008, 14:23:05 Předmět: |
|
|
Taky to trochu nechápu. Mám dojem, jako bys nevěřil GC, že ti všechny managed objekty uvolní.
Nebo máš plnou aplikaci unmanaged věcí? _________________ Mám strach |
|
Návrat nahoru |
|
|
DOMM
Založen: 12. 03. 2008 Příspěvky: 5 Bydliště: Morava
|
Zaslal: 13. březen 2008, 16:08:09 Předmět: |
|
|
Nemam konkretni aplikaci, jen jsem o tom tak premyslel.
Cetl jsem v knize, ze kdyz bych chtel pouzit destruktor, tak je spis lepsi odpojit zdroje pres metodu dispose. Protoze kdyz pouziju destruktor, tak GC odstrani objekt z pameti az ve druhym pruchodu.
No a protoze muzu vyvolat GC sam, tak me napadlo, jestli by nebylo rychlejsi, kdybych u vsech objektu vyvolal uklizeci metodu a pak vyvolal GC.
Ne vsechny objekty jsou pripojeny na nejaky zdroje, jasny. Ale mohl bych odstranit vsechny odkazy na jiny objekty a tak (treba pole).. a GC to pak vsechno pekne odstrani.
Jen jsem premyslel o takove optimalizaci, nebo nejakym zrychleni. Nevim jestli je to zdarna myslenka.
Ty vychozi objekty, u kterych bych volal dispose, tak na ne nemam "jako" okdaz, ale asi bude stejne lepsi si je nekde nahazet do pole, ze? Kdybych chtel praktikovat co jsem psal vys. |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 13. březen 2008, 17:02:42 Předmět: |
|
|
Zda se mi, ze se snazis o nestandardni pouziti .NETu jen kvuli tomu oblibenemu slovu "optimalizace". Optimalizovat musis az v okamziku, kdy vis, ze neco konkretniho ti bezi prilis pomalu. Pak mas konkretni duvod a muzes to konkretne resit.
Co se tyce metody Dispose, tu volej pouze pokud chces uvolnit unmanaged zdroje. K tomu je urcena.
Destruktor vubec nemusis resit. O managed zdroje se postara GC, o unmanaged se postara metoda Dispose, kterou si zavolas az ty objekty prestanes pouzivat.
Pokud ti jde o to, aby sis nemusel pamatovat ty objekty, jejichz unmanaged zdroje se maji uvolnit a chces je vsechny v jednom okamziku jednim vrzem Disposnout, je to trochu jina otazka. _________________ Mám strach |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 13. březen 2008, 17:20:50 Předmět: |
|
|
DOMM> Pokud jde o alokace a uvolnovani pameti v managed jazycich jako je .NET nebo Java, tak rucni volani GC s myslenkou, ze mu tim pomuzes je spis naivni a sami autori tech runtime ho nedoporucuji. Ty GC jsou navrzene tak, aby davaly co nejlepsi vykon pri normalnim pouziti (a napr. deli objekty podle toho, jestli jsou docasne nebo dlouhodobe). Tim, ze budes volat GC rucne spis dosahnes toho, ze aktualni docasne objekty se ti dostanou mezi dlouhodobe a jejich uvolnovani bude trvat dele. Nejlepsi zpusob jak optimalizovat pro GC je chovat se tak, jak autori GC cekali. Coz znamena chovat se normalne a nevymyslet nesmyslne optimalizace.
K ukoncovani aplikace a volani Dispose() - to vubec neni potreba, odpad po aplikaci prinejhorsim uklidi operacni system (ano, uz i windows to umi ).
Jinak metoda Dispose je urcena k tomu, aby ji clovek volal rucne ve chvili kdy vi, ze uz ty zdroje nebude potrebovat. Samozrejme u vsech trid, ktere ji maji je NUTNE implementovat i finalizer, ktery Dispose zavola v pripade, ze na to uzivatel zapomene. Z toho co jsi psal mi prislo, ze si myslis, ze tu metodu vola GC sam. Nevola (pokud ji nezavolas z finalizeru), prave proto je ten uklid rychlejsi. Kdyby ji volal, tak musi resit stejne problemy jako ty finalizery a ten uklid by taky byl pomaly. Nicmene pokud nepouzivas zdroje, ktere je nutne explicitne uklidit (a kdybys pouzival, tak o tom asi vis), tak neni nutne nic z toho delat, o vsechno se postara automaticky GC.
K udrzovani pole vsech objektu a podobnych veci - tohle je presne zpusob, jak v managed jazycich vyrobit memory leak. Proste na kazdy objekt porad bude z toho pole reference a GC ho nebude moct zrusit, protoze z jeho pohledu bude zivy. (i kdyz reseni existuje pomoci weak referenci) _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
|