2009-08-28 16 views
40

Estoy haciendo un espacio en blanco en este caso y parece que no puedo encontrar ningún ejemplo anterior que haya escrito. Estoy tratando de implementar una interfaz genérica con una clase. Cuando implemento la interfaz, creo que algo no funciona bien porque Visual Studio produce continuamente errores que indican que no estoy implementando todos los métodos en la Interfaz genérica.Implementar una interfaz con métodos genéricos

Aquí es un esbozo de lo que estoy trabajando con:

public interface IOurTemplate<T, U> 
{ 
    IEnumerable<T> List<T>() where T : class; 
    T Get<T, U>(U id) 
     where T : class 
     where U : class; 
} 

Entonces, ¿qué debe mi clase parecerse?

+1

título de la pregunta incorrecta. Hay métodos genéricos en clases e interfaces normales, y hay interfaces genéricas con métodos. – Kobor42

Respuesta

69

usted debe reelaborar su interfaz, así:

public interface IOurTemplate<T, U> 
     where T : class 
     where U : class 
{ 
    IEnumerable<T> List(); 
    T Get(U id); 
} 

a continuación, se puede implementar como una clase genérica:

public class OurClass<T,U> : IOurTemplate<T,U> 
     where T : class 
     where U : class 
{ 
    IEnumerable<T> List() 
    { 
     yield return default(T); // put implementation here 
    } 

    T Get(U id) 
    { 

     return default(T); // put implementation here 
    } 
} 

O bien, puede aplicar de manera concreta:

public class OurClass : IOurTemplate<string,MyClass> 
{ 
    IEnumerable<string> List() 
    { 
     yield return "Some String"; // put implementation here 
    } 

    string Get(MyClass id) 
    { 

     return id.Name; // put implementation here 
    } 
} 
+0

Perfecto. Sabía que tenía que especificar los vars genéricos, pero no podía recordar dónde (sin juego de palabras).Gracias Reed! –

+1

El resultado deseado puede no ser posible, pero IMO esta respuesta no tiene métodos genéricos, sino más bien una clase genérica con métodos dependientes. Técnicamente parece que los métodos genéricos tendrían sus propios parámetros de plantilla. – Catskul

+0

Tienes razón. Título incorrecto de la pregunta, pero buena respuesta para la pregunta. – Kobor42

9

creo que es probable que desee volver a definir su interfaz de la siguiente manera:

public interface IOurTemplate<T, U> 
    where T : class 
    where U : class 
{ 
    IEnumerable<T> List(); 
    T Get(U id); 
} 

Creo desea que los métodos a utilizar (reutilización) los parámetros genéricos de la interfaz genérica en la que están declaradas; y que probablemente no desee convertirlos en métodos genéricos con sus propios parámetros genéricos (distintos de la interfaz).

Teniendo en cuenta la interfaz como redefiní ella, puede definir una clase como esta:

class Foo : IOurTemplate<Bar, Baz> 
{ 
    public IEnumerable<Bar> List() { ... etc... } 
    public Bar Get(Baz id) { ... etc... } 
} 

o definir una clase genérica de esta manera:

class Foo<T, U> : IOurTemplate<T, U> 
    where T : class 
    where U : class 
{ 
    public IEnumerable<T> List() { ... etc... } 
    public T Get(U id) { ... etc... } 
} 
+0

También puede implementar esto como una clase genérica, es decir: clase Foo : IOurTemplate - No estoy seguro de qué opción tenía Jason. –

+0

Tienes razón, añadiré eso. – ChrisW

1

- Editar

El otras respuestas son mejores, pero tenga en cuenta que puede hacer que VS implemente la interfaz por usted, si no está seguro de cómo debería verse.

Proceso descrito a continuación.

Bueno, Visual Studio me dice que debería tener este aspecto:

class X : IOurTemplate<string, string> 
{ 
    #region IOurTemplate<string,string> Members 

    IEnumerable<T> IOurTemplate<string, string>.List<T>() 
    { 
     throw new NotImplementedException(); 
    } 

    T IOurTemplate<string, string>.Get<T, U>(U id) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Tenga en cuenta que todo lo que hice fue interfaz de escritura, a continuación, haga clic en él, y esperar a que el pequeño icono al emergente para tener VS generar el aplicación para mí :)

+0

Vea: aunque usted se especializó 'T' y' U' en la interfaz (ambos son 'string'), los métodos mismos son genéricos con sus propios parámetros genéricos separados/distintos ... que probablemente no es lo que el OP destinado a. – ChrisW

+0

Acepto, creo que su consejo es bueno, solo estaba mostrando cómo es posible que VS implemente la interfaz por usted, si está confundido acerca de cómo se ve. –

Cuestiones relacionadas