17. december 2005 - 22:12Der er
8 kommentarer og 1 løsning
C# 2.0 generics og operatorer
Jeg ønsker at lave en generisk klasse, som kan arbejde på typen T:
class Test<T> { public T Multiply(T t) { return t * t; } }
Det giver compilerfejl, idet multipliceringsoperatoren ikke er kendt af typen T. Det er selvfølgelig OK, da ikke alle klasser specificerer * operatoren. MEN: Er der en måde at få ovenstående til at virke ? F.eks. en måde at specificere, at klassen kun må instantieres med en type; som definerer * operatoren ?
Man kan selvfølgelig definere Multiply metoden i et interface/abstrakt klasse, som i MS' eksempel; men så skal jeg alligevel definere den samme metode; t*t, for alle de typer, hvor jeg ønsker Multiply funktionaliteten. Det er måske overkommeligt for de generelle value typer, som short, double, int, osv. Men jeg kunne godt tænke mig en måde, hvor: 1) Jeg kun behøver at definere metoden ( return t*t ) én gang (den er længere i det konkrete tilfælde, jeg skal bruge den) 2) At klassen kan bruges med alle typer T, hvor * operatoren er defineret; f.eks. hvis jeg selv lavede en klasse Matrix, hvor jeg definerer * operatoren.
Jeg ved ikke om det er muligt; så vidt jeg kan se på artiklen nielle linker til, er det ikke muligt. Men jeg lader lige spørgsmålet stå åbent lidt endnu, måske nogen har en smart løsning ?
Jeg er ikke helt klar over hvad arne_v mener med ICalculatable, men jeg gætter på at det betyder noget med at + og * er defineret på forhånd i en eller anden forstand.
Hvis dette er tilfældet, vil jeg da godt lige påpege at selvom en given klasse måske har en velderfineret, og naturlig addition, så er der ikke nogen garanti for at den så også vil have en ditto multiplikation. Et eksempel kunne være vektorer - vi kan nemt definere hvad det vil sige at addere to vektorer, men bortset fra prikproduktet (som i parentes bemærket ikke er en ordentlig multiplikation idet den ikke selv giver en vektor) så kan vi ikke gange to vektorer på nogen fornuftig måde (med undtagelse af 3D vektorer hvor vi har krydsproduktet som en mulig kandidat).
Overført til klasser, så vil dette sige at der findes klasser som har en naturlig definition af + operatoren (men ikke nødvendigvis af - operatoren), uden at dette betyder at der er en naturlig * operator (eller / eller % eller << operator). Derfor er det også lidt af et puzzlespil, hvis man skal til at definere hvilke operatorer en given klasse ved at angive hvilke interfaces den implementere.
det er ret normalt at + operatoren findes for noget som de andre operatorer ikke findes for
min tanke var hvis: - operator overload havde været non static i C# - MS havde lavet et interface ICalculatable med de 4 (eller 5 hvis vi tager modulus med) operatorer - og alle de basale tal typer i .NET havde implementeret dette interface så havde man kunnet en del ting med generics.
det var så kun de klasser hvor alle 4 eller 5 operatorer gav mening som skulle implementere det, men der vil være en del
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.