VB.NET dinamikus típus konverzió
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:
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:
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
■ 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
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
Találtam megoldást!
Sikerült találnom egy megoldást, gondoltam megosztom az utókorral... ;))
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
jaaj
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.
erre inkább nem reagálok
Rendben
Nézzük csak...
OK
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 avirtual
). 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 azOverrides
kulcsszót kell használni, C# -ban pedig azoverride
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.
töröltem...
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.