Avatar billede dresen Nybegynder
25. august 2009 - 21:02 Der er 5 kommentarer og
1 løsning

Generic new() constraint

Hej eksperter

Jeg har et spørgsmål omkring generic types og /the type parameter/ skal have en konstruktør, som ikke tager nogle argumenter.

Det samme spørgsmål er stillet flere gange i forskellige fora, og optræder blandt andet også her på eksperten: tråd:http://www.eksperten.dk/spm/876807

Det samme svar gives igen og igen; at det skal ekspliciteres at /the parameter type/ har en tom konstruktør, ved at gøre brug af where T : new() og at man kan lave work arounds vha. factory klasser.

Jeg savner dog svar på, *hvorfor* man ikke kan gøre brug af en konstruktør med parametre - hvad ligger til grund for det? Burde man f.eks. ikke vha. constraints kunne angive antallet af argumenter + deres base types, og herved sikre type safety?

Jeg overser garanteret noget åbenlyst. Men hjælp mig gerne til at forstå det.

Et følgespørgsmål. Er der et klassisk konkret eksempel på, hvornår det giver mening at bruge ovenstående. Det eksempler jeg har set, har alle været abstrakte.

På forhånd tak / d
Avatar billede arne_v Ekspert
25. august 2009 - 21:11 #1
De kunne have tilladt:
  where T : new(int,int)
o.s.v., men det gorde de ikke.

C# generics tillader kun at man definerer en constructor uden argumenter.

Der er saa vidt jeg ved ikke nogen evigtgyldige grunde til det. Men et eller andet sted skal man saette graensen.

Og de valgte altsaa at tillade constructor uden argumenter og ikke mere.

Et bedre svar skal du nok have fra Anders Hejlsberg.
Avatar billede arne_v Ekspert
25. august 2009 - 21:12 #2
Jeg forstaar ikke det med eksempel. Der er vel masser af eksempler paa generics meed new().
Avatar billede dresen Nybegynder
26. august 2009 - 02:23 #3
Hej arne_v

Tak for dit svar. Jeg taler med Anders H ved lejlighed :]

Måske jeg har været for hurtig på aftrækkeren, men jeg synes kun
at have stødt på simple/abstakte eksempler af typen:

class Test<T> where T : new() {
  T obj;
  public Test() {
    obj = new T(); // create a T object
  }
...

Ideen kan jeg selvfølgelig godt forstå på baggrund af eksemplet og måske jeg bare skal være tilfreds med dette.

Smid et svar / dres
Avatar billede arne_v Ekspert
26. august 2009 - 03:32 #4
Det er jo ikke meget mere avanceret end dette.

Man har en generisk klasse og i en af klassens metoder har man brug for at lave en ny T.

Det kan vaere i constructor eller det kan vaere i en anden metode.

Men det er jo ikke unormalt at have behov for at lave en ny T.

En anden maade at se paa det er: man kan ikke lave en ny T i Java generics og det savnes ofte !
Avatar billede arne_v Ekspert
26. august 2009 - 03:33 #5
og et svar
Avatar billede dresen Nybegynder
28. august 2009 - 18:58 #6
Hej arne_v

Mange tak for info. Ja, har læst om Java-folk der river sig i håret fordi de ikke kan instanciere T, og derfor må bøvle på med factories.

God weekend
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