ugrás a tartalomhoz

VB.NET dinamikus típus konverzió

halee · 2008. Feb. 5. (K), 14.53
Sziasztok,

Egy olyan kérdésem lenne, hogy hogyan tudom azt megoldani VB.NET-ben, hogy adott néhány osztályom közös szülőosztállyal, ezeket szépen belepakolom egy ArrayList-be, vagy bármely más listába és amikor végig iterálok a listán, akkor az aktuális elem render metódusát meghívva, na a szülő osztály render-e fusson le?

Régebben csináltam ilyet php-ben, ott ez teljesen sim ügy.

Egy rövid példakód, hogy mire gondolok:
...
public class base

public sub new()
end sub

public function render() as string
 return "Base"
end function

end class

public class child
 inherits base

public sub new()
 MyBase.new()
end sub

public function render() as string
 return "Child"
end function

end class

...

Dim lista as ArrayList = new ArrayList()

lista.add(new base())
lista.add(new child())

for i as integer=0 to lista.Count()-1
 Response.WriteLine(lista(i).render())
next


Ebben az esetben a kód ugyan lefut hiba nélkül, de mindkét esetben a base render metódusa fut.

Sajnos egyetlen lehetőséget találtam ennek kikerülésére, az pedig az, hogy egy select case-el a lista(i).GetType alapján szétválasztom és típuskényszerítem a különböző objektumokat. Ez viszont elég rugalmatlan sok különböző objektum esetén.

amire szükségem lenne, az logikailag így nézne ki:

(CType(lista(i),lista(i).GetType())).Render()


de ez sajnos nem működik...

Ha valaki tud erre a select case-nél rugalmasabb megoldást az pls help!

előre is köszi,
Halee
 
1

Találtam megoldást!

halee · 2008. Feb. 5. (K), 15.17
Sziasztok,

Sikerült találnom egy megoldást, gondoltam megosztom az utókorral... ;))

Dim lista as ArrayList = new ArrayList()

lista.add(new base())
lista.add(new child())

for i as integer=0 to lista.Count()-1
 Dim elem as Object=lista(i)
 Convert.ChangeType(elem, elem.GetType())
 Response.WriteLine(elem.render())
next
2

jaaj

Rici · 2008. Feb. 5. (K), 17.06
Nagyon nem ezt kell csinálni...

Nem bántani akarlak, de miért ugrasz neki egy adott nyelven programokat írni, amikor nagyon nincs meg a szükséges tudásod hozzá?

Érdemes lenne előtte végigolvasni egy könyvet vagy egy online doksit, ami leírja, hogy miről is van szó.

Ráadásul ez egy nagyon alap dolog lenne. Mindesetre a helyes megoldást megtalálod itt: override.
3

erre inkább nem reagálok

halee · 2008. Feb. 5. (K), 17.51
erre inkább nem reagálok
4

Rendben

Rici · 2008. Feb. 5. (K), 18.21
Bár tényleg leírhatnád, hogy mivel nem értesz egyet.
5

Nézzük csak...

halee · 2008. Feb. 5. (K), 20.59
Leginkább a stílusoddal...
6

OK

Rici · 2008. Feb. 5. (K), 22.17
Először is köszi a hosszú választ, szerintem jó, hogy leírod a véleményed, minthogy elhallgasd. Semmit nem tételeztem fel arról, hogy te milyen überbrutál rendszereket dobtál már össze és milyet nem. Az egyetlen kiindulópontom az a kód volt, amit beküldtél ide kérdésként. Ez alapján pedig akár tetszik, akár nem, ez tipikusan az az amatőr eset, hogy nekiáll valaki programozni anélkül, hogy a nyelv alapvető dolgaival tisztában lenne. Ráadásul úgy látom, hogy a mellékelt linken lévő tartalom lényege nem nagyon jött át neked. De erről majd később. Jah, és itt nagyon nem arra gondolok, hogy ténylegesen leforduló, éles kódot küldj be. Mellesleg elkezdhetném szép sorban visszautasítani a vádaidat, de valószínűleg senkit nem érdekelne, és a témához sincs semmi köze. És jótanácsként mondom, hogyha valakinek beszólsz, próbálj a feltételezéseid helyett az egyértelmű tényekre szorítkozni. De ezt inkább hagyjuk, így is túl sok a személyeskedés.

Térjünk a lényegre. Mégegyszer: nem a szintaktikailag 100%-os korrektséggel meg a példa értelmességével vagy hasonlóval van problémám. Egy eléggé alapvető dolgot hagytál ki, amit mellesleg pontosan leír az említett link, és teljesen biztos, hogy az összes VB.NET -tel foglalkozó könyv is.

Ez pedig az override fogalma. Ez pl. C# -ból is mindenképp ismerős kell hogy legyen, feltéve, hogy tényleg dolgoztál már C#-ban. A lényege, hogy ha egy metódusnál meg akarod engedni, hogy egy származtatott osztályban lecserélhesd a működését, akkor meg kell adni, hogy ő felüldefiniálható (Overridable kulcsszó VB.NET-ben, C# -ban és C++ -ban a virtual). A származtatott osztályban, amiben pedig felüldefiniálod, ott meg kell adni, hogy ez most egy felüldefiniálás. Ez pl. C++ -hoz képest új dolog, ott kulcsszó nélkül is felüldefiniálás történik, VB.NET -ben az Overrides kulcsszót kell használni, C# -ban pedig az override kulcsszót. Ha nem használod ezeket a kulcsszavakat, akkor nem történik felüldefiniálás, ha az ősosztály tagjaként hivatkozol bármelyik példányra, akkor a példádnak megfelelően az ősosztályban lévő metódus fog meghívódni, nem pedig az aktuális példány tényleges osztályának megfelelő metódus.

Igazából ennyi lenne, mindenképp vesd össze a leírtakat az átküldött linkkel. Ha van további kérdésed, arra is szívesen válaszolok.


Utólagos update: sajnos kitörölted a jó hosszú válaszodat, de igazából itt nem is ez a lényeg.
7

töröltem...

halee · 2008. Feb. 5. (K), 22.35
Szia,

A hosszúválaszt pontosan azért töröltem, mert egyrészt úgy gondoltam, hogy az indulatból személyeskedés nem vezet sehova és inkább törlöm, mint tényleg olyan irányba menjen a fórum, másrészt higgadtabb pillanatomban járjöttem, hogy egyszerű stílusod ellenére igazad volt.

Igen dolgoztam php-ben és csharpban is, és igen ismerős az általad említett megoldás. Jelenleg éppen egy olyan fázisban tartok, hogy csharp-ról állok át VB.NET-re, az új munkahelyemen ugyanis ezt használják/használjuk.

Sajnos nem egy, nem két dologgal találkoztam az elmúlt időszakban, ami VB.NET-ben nem, vagy csak nehézkessebben megoldható, mint Csharp-ban, ezért is valószínű kicsit indulatosabban áltam a válaszodhoz, mint úgy általában, illetve valóban nem tűnt fel elsőre az overridable kulcsszó, és az elmúlt időszak tapasztalatai alapján viszonylag hamar vagyok képes elfogadni, hogy VB.NET-ben egyszerűen bonyolultabb megoldásokat kell keresni.

Egy link azoknak akik hasonló cipőben járnak

Igazából amikor ezt a linket megtaláltam, akkor olvastam újra az általad küldött linket és töröltem a talán kissé oktalanul és talán indulatból fogalmazott válaszomat.