Avatar billede idiotbarn Nybegynder
04. september 2011 - 13:11 Der er 4 kommentarer og
1 løsning

Generics - T som interface

Hej
Jeg sidder med et lille problem i .net 4.0.
Jeg har interfacet:

    public interface IP
    {
        IG foo(IG gen);
    }

og en implementation:

    public abstract class P<T> : IP where T: IG
    {
        public abstract T foo(T g);
    }

Jeg får fejlen at klassen P ikke implementerer "IG foo(IG gen)" hvilket den jo har ret i, men hvorfor virker det ikke når den implementerer "T foo(T gen)" hvor T er låst til at være IG?

Er der nogen måde at få det til at fungerer uden at lave et interfacet om så den bruger generics (IP<T>)?
Avatar billede heinzdmx Nybegynder
04. september 2011 - 14:02 #1
Umiddelbart forstår jeg ikke hvorfor du vil bruge T da den jo er låst fast til en bestemt type alligevel?
Avatar billede idiotbarn Nybegynder
04. september 2011 - 16:06 #2
Det er for at jeg kan bruge foo uden at skal caste varablen "g"

Fx:
public NewClass : P<G_Implementation>
{
  public G_Implementation foo( G_Implementation g)
  {...}
}

Hvis jeg blot har P klassen som IG, vil jeg skulle:


public NewClass : P
{
  public IGfoo( IG g)
  {
      G_Implementation g2 = (g as G_Implementation )
  }
}

Ikke at det er de store problem, men alligevel :)
Avatar billede arne_v Ekspert
04. september 2011 - 16:13 #3
Den skal fejle.

Interfact lover at man kan kalde foo med hvad som helst der implementerer IG.

Din klasse har en foo man kan kalde med hvad som helst der implementerer/extender T som implementerer IG.

Hvis vi laver et lille hiraki:

    |--X
IG--|
    |--Y

saa lover IP foo at den kan kaldes med instanser af baade X og Y, mens P<X> foo kun kan kaldes med instamser af X.

Duer ikke.

(der er ioevrigt ogsaa et tilsvarende problem med retur vaerdien i C#)

Jeg tror at du bliver noedt til at redesigne.
Avatar billede idiotbarn Nybegynder
04. september 2011 - 17:07 #4
Ok, tak for forklaringen, det giver jo fint mening :)
Ligger du et svar?
Avatar billede arne_v Ekspert
04. september 2011 - 19:25 #5
svar
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

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