...skriver ofta klasser där jag behöver spara många object i "collections". Då använder jag gärna t.ex. en ArrayList som jag sparar mina object i. Problemet är då att den alltid returnerar datatypen 'object'.
Ah enkelt säger jag då... då ärver jag arraylisten i en egen class som döljer indexeraren this[int index] som returnerar ett object, med en indexerare som returnerar det typecast:ade objectet. MEN med override kan jag inte ändra returtyp. och med new kan jag dölja arraylistens orginal-indexerare. Det funkar att skriva som "det är tänkt" men studions Intellisense fattar det inte, då måste jag typecasta helatiden för att det ska bli rätt...
exempelkod:
public class myCollection : ArrayList
{
public new this[int index]
{
get{return (myThing)base[index];}
}
}
public struct myThing
{
public string Name;
}
om jag mha exemplet ovan skriver
minCollection[0].Name;
så fattar compilatorn vad jag menar men inte studions Intellisense.
Vill jag att intellisense ska funka måste jag casta
((myThing)minCollection[0]).Name;
Finns det nått kul sätt att lösa detta i Framework 1.1
(har sett att det finns nått som hette.... eh... ah, som funkar som templates i C++, i Framework 2.0 som kommer att lösa detta problem, men som sagt, där är vi inte än.).
Precis, det är generiska typer du vill ha. Nej, det finns inget bra sätt att lösa detta på. Kompilatorn tillåter som du märkt inte sådan överlagring som du vill göra. Du skulle kunna skriva en ny metod som har rätt returtyp, iofs, men det blir inte lika snyggt som med operatoröverlagring. Typ:
public class myCollection : ArrayList
{
public myThing get(int index)
{
return (myThing) this[index];
}
}
Nej, jag använder Java och C++ som har generiska typer istället ;) Skämt åsido, det är bara att bita ihop och casta loss. Tänk glada tankar och kom ihåg att snart slipper du eländet. Att skapa egna klasser som ärver från olika collections är enligt mig för mycket jobb med för lite förtjänst, även om koden skulle bli snyggare.
256 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e