.[ ČeskéHry.cz ].
Objektové rozhraní
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Web Development
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
MelkorNemesis



Založen: 27. 10. 2007
Příspěvky: 12

PříspěvekZaslal: 9. únor 2008, 16:22:49    Předmět: Objektové rozhraní Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 9. únor 2008, 16:34:05    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1525
Bydliště: Telč

PříspěvekZaslal: 9. únor 2008, 20:00:13    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
MelkorNemesis



Založen: 27. 10. 2007
Příspěvky: 12

PříspěvekZaslal: 10. únor 2008, 13:04:46    Předmět: Odpovědět s citátem

diky semo Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DOMM



Založen: 12. 03. 2008
Příspěvky: 5
Bydliště: Morava

PříspěvekZaslal: 12. březen 2008, 23:50:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1525
Bydliště: Telč

PříspěvekZaslal: 13. březen 2008, 10:12:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
DOMM



Založen: 12. 03. 2008
Příspěvky: 5
Bydliště: Morava

PříspěvekZaslal: 13. březen 2008, 10:53:59    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 13. březen 2008, 11:43:02    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
DOMM



Založen: 12. 03. 2008
Příspěvky: 5
Bydliště: Morava

PříspěvekZaslal: 13. březen 2008, 13:35:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1525
Bydliště: Telč

PříspěvekZaslal: 13. březen 2008, 14:05:43    Předmět: Odpovědět s citátem

...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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 13. březen 2008, 14:16:01    Předmět: Odpovědět s citátem

]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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 13. březen 2008, 14:23:05    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
DOMM



Založen: 12. 03. 2008
Příspěvky: 5
Bydliště: Morava

PříspěvekZaslal: 13. březen 2008, 16:08:09    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 13. březen 2008, 17:02:42    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 13. březen 2008, 17:20:50    Předmět: Odpovědět s citátem

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 Wink).

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Web Development Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna