[ Sapphire @ 09.10.2009. 11:48 ] @
Da li je moguće ograničiti type argument metode, da bude samo na određenu klasu i njene derivate?

Radim nešto kao:

Code:

public void RegisterForSomeClassChangedEvent(SomeClass.ChangedEventHandler handler, Type settingsMemberType)


Prvi argument je naravno delegat, ali ovaj drugi - type, to me zanima može li se ograničiti samo na SomeClass i njene derivate ? Sve mi govori da naravno ne može, ali možda mi je samo mozak zablokirao :)


Znam da bi mogao nešto ovako:
Code:

public void RegisterForSomeClassChangedEvent<T>(SomeClass.ChangedEventHandler handler, T type) where T : SomeClass

ili
Code:

public void RegisterForSomeClassChangedEvent<T>(SomeClass.ChangedEventHandler handler) where T : SomeClass

pa da iskoristim typeof(T) kao type.

Edit: zanima me bez upotrebe generics-a ...
[ negyxo @ 09.10.2009. 11:57 ] @
Bez genericsa ja bih rekao ne. Type sistem se oslanja na type, kao sto i ime kaze , znaci ako kazes da sve sto je tipa type moze da bude parametar, onda je to bilo koji type.
[ Sapphire @ 09.10.2009. 14:09 ] @
Ma da .. Statički, ne može se izvesti.. Ali moglo bi npr. pomoću PostSharp-a (ili Castle Dynamic Proxy-a direktno) da izbaci exception, ali to isto nije što želim ...
Uglavnom, i generics način radi zadovoljavajuće ...
[ negyxo @ 09.10.2009. 14:47 ] @
Ako se ne varam PostSharp je bio ekesperimentalni jezik, osnovao je bio C#, sada se to se pretocilo u CodeContracts tako da je on verovatno mrtav. Bacanja exceptiona kod ovakvih stvari onda totalno ubija smisao static typing-a, zato su tu generici, pa recimo i overloadi jer recimo preko overloada ti mozes staticki da odredjues flow strukturu.
[ Sapphire @ 09.10.2009. 14:58 ] @
Pa da, zato sam i rekao da ne bi to da uradim... To je i razlog zašto nisam isprva odmah htio generics-e, jer nepotrebno komplikuju (dobro, i ne komplikuju, ali uvijek gledam da je što jednostavnije).

PostSharp je AOP (Aspect Oriented Programming) framework za .NET, ne znam baš da mislimo na isto?
http://www.postsharp.org/

Btw, CodeContracts, šta je tu mrtvo? (.NET 4.0 ? )

[ negyxo @ 09.10.2009. 15:05 ] @
Sorry, ja sam procitao sta sam mislio a ne sta pise.

Zamenio sam PostSharp sa Spec# koji je nastao kao eksperimentalni jezik, bas za ovakve stvari da se dodaju constraint-i u metodama, za njega sam mislio da je mrtav ne CodeContracts.

[ mmix @ 09.10.2009. 16:37 ] @
A polimorfizam? Objekti nasledjene klase se polimorfno redukuju na baznu i implicitno prolaze typecheck.

Code:

public void RegisterForSomeClassChangedEvent(SomeClass.ChangedEventHandler handler, SomeType settingsMemberType)


[ Sapphire @ 09.10.2009. 16:48 ] @
@mmix:

Ovaj argument "SomeType", kako ću ga postaviti na išta drugo od Type? Šta ti je SomeType u ovom slučaju?

typeof(SomeClass) naravno ne radi kao vrsta argumenta.

Nije meni problem da neki objekti neće, a neki hoće. Problem je što želim ograničiti da odmah pri compile-time ne da ništa nego Type nekog objekta (i derivata). Možda ne kontam šta hoćeš da kažeš ...

[ Sapphire @ 09.10.2009. 17:00 ] @
hmmmm ... mislim da sad kontam šta hoćeš reći, misliš na polimorfizam objekta, a ne tipa? Pa, ne želim prosljeđivati
new SomeObject()
nego samo tip...

Da je cijeli objekat, to je drugo, onda je jednostavno pozvati GetType()...
[ mmix @ 09.10.2009. 18:50 ] @
A ok, nismo se razumeli, sad kontam sta hoces a odgovor je da ne moze bar ne bez runtime provere i exceptiona sto pobija tvoj compile time zahtev, cak i jezici koji bi ti pruzili te konstrukcije moraju to da urade runtime jer CLI ne podrzava taj mehanizam u hederu metoda i ne postoji nacin da se to ogranicenje opise ILom. Problem je sto je settingsMemberType instanca tipa Type koja ne mora da dodje samo od typeof(SomeType) ili derivata, moze da dodje i iz drugih izvora (npr enumeracijom tipova u asembliju ili refleksijom remoting tipa), tako da kompajler ne moze da forsira bilo kakav check tokom prevodjenja.

Btw mene je i zbunilo tvoje prvo resenje (sa "T type" kao drugim parametrom) koji prosledjuje instancu T objekta ne Type-a, pa se to onda svodi na ovo sto sam ti ja dao.
Drugo generics resenje koje si dao je medjutim sasvim ok, ne bih ja bezao od toga, slican fazon se maksimalno koristi u LINQ-u i to radi sasvim ok i daje ti ono sto ti hoces.