Avatar billede driis Nybegynder
17. december 2005 - 22:12 Der 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 ?
Avatar billede nielle Nybegynder
17. december 2005 - 22:38 #1
Microsoft har selv angivet en mulig løsning på det problem

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/csharp_generics.asp

- søg på kodeeksemplet:

Calculator
Avatar billede driis Nybegynder
17. december 2005 - 22:53 #2
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 ?
Avatar billede arne_v Ekspert
19. december 2005 - 00:55 #3
der er så vidt jeg kan se hele 2 problemer:
  - MS har glemt at lave ICalculatable
  - operator overloads er static
som gør at det ikke kan lade sig gøre

.NET generics er meget forskellige fra C++ templates
Avatar billede driis Nybegynder
19. december 2005 - 11:22 #4
OK - læg et svar, begge 2.
Avatar billede nielle Nybegynder
19. december 2005 - 19:17 #5
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.
Avatar billede arne_v Ekspert
19. december 2005 - 20:38 #6
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
Avatar billede driis Nybegynder
19. december 2005 - 21:22 #7
Det var netop noget i den retning, jeg håbede fandtes. Men jeg må undvære, indtil videre ;-)

arne, der er også point til dig hvis du lægger et svar.
Avatar billede arne_v Ekspert
19. december 2005 - 23:50 #8
ingen point for at beskrive noget som ikke er der
Avatar billede stormy Nybegynder
20. december 2005 - 00:15 #9
Interesserede kan også med fordel læse :

http://www.codeproject.com/csharp/genericnumerics.asp
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester