2010-01-05 20 views
60

Esta es una pregunta de sintaxis. Tengo una clase genérica que hereda de una clase base genérica y aplica una restricción a uno de los parámetros de tipo. También quiero que la clase derivada implemente una interfaz. Por mi vida, parece que no puedo descifrar la sintaxis correcta.Heredar de una clase base genérica, aplicar una restricción e implementar una interfaz en C#

Esto es lo que tengo:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... } 

El primero que me vino a la mente fue la siguiente:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... } 

Pero eso es incorrecto, ya que causa T2 a tener que poner en práctica tanto Ibar y IFoo , no DerivedFoo para implementar IFoo.

He intentado un poco de Google, el uso de dos puntos, punto y coma, etc., pero me he quedado corto. Estoy seguro de que la respuesta es muy sencilla.

+0

PlusOne para golpear la cabeza simple. – Robino

Respuesta

100

Incluye la firma completa de su clase antes de definir restricciones genéricas.

class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar 
{ 
    ... 
} 
+3

Para otros, he internalizado esto como que una clase solo tiene una cláusula where y va al final para cualquier y todas las restricciones de tipo genérico. – Visser

+0

@Visser Se permite tener múltiples cláusulas where, clase Prueba donde T1: Interface1 donde T2: Interface2 – bwing

6
public interface IFoo {} 
public interface IBar {} 

public class ParentFoo<T,T1> { } 
public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { } 
14

Mi recomendación: cuando usted tiene una pregunta acerca de la sintaxis del lenguaje C#, leer la especificación; es por eso que lo publicamos. Querrá leer la sección 10.1.

Para responder a su pregunta específica, el orden de las cosas de una declaración de la clase es:

  • atributos, entre corchetes
  • modificadores ("público", "estática", y así sucesivamente)
  • "parcial"
  • "clase"
  • el nombre de clase
  • una lista separada por comas de declaraciones de parámetros de tipo dentro de corchetes angulares
  • dos puntos siguió una lista separada por comas de tipos de bases (clase base y las interfaces implementadas, clase base debe ir primero si hay uno)
  • tipo limitaciones de parámetros
  • el cuerpo de la clase, rodeado por llaves
  • un punto y coma

todo en esa lista es opcional excepto por "clase", el nombre, y el cuerpo, pero todo debe aparecer en ese orden si aparece.

+62

Eric, aunque te respeto mucho como profesional y aprecio tus comentarios, no puedo evitar sentirme frustrado por lo que viene a través de una respuesta abrasiva. Me está criticando por elegir hacer una pregunta en un sitio de Q & A sobre localización, descarga y búsqueda a través de un documento de Word de 503 páginas altamente técnico enterrado en un enlace en MSDN. Eso es bastante duro. Este fue el uso más eficiente de mi tiempo y tiene el beneficio adicional de que puede ayudar a alguien más más tarde.El enlace a la especificación de C# Lang para los interesados ​​es: http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx –

+12

No se pretendía ninguna crítica. Existe un sesgo generalizado en la comunicación de texto puro que hace que las declaraciones simples de hechos suenen bruscas y abrasivas; Intento leer caritativamente cuando me presentan una lista de hechos útiles, y recomiendo que también lo hagas. Estoy de acuerdo con mi recomendación; si tiene preguntas sobre la sintaxis, la especificación las responde de manera definitiva y comienza con una tabla de contenidos útil para localizar definiciones de sintaxis específicas. –

+2

Dan, encontrar la especificación C# es tan simple como ingresar 'C# Spec' en Google y presionar el botón 'Tengo suerte'. Y si usted es un desarrollador profesional de C#, ya debería tener la especificación C# en formato PDF en su máquina. Además, tampoco quiero criticarte. No estaba acostumbrado a leer las especificaciones antes, pero comencé a leerlo gracias a Jon, Eric y Pavel, que siempre cita las especificaciones de C# para cualquier pregunta. Encontré que la especificación de C#, aunque a veces podría ser difícil de leer, es una gran manera de aprender sobre el idioma. – SolutionYogi

Cuestiones relacionadas