una que programacion poo polimorfismo interfaz interfaces implementacion herencia derivada clases clase abstractas abstracta c# generics inheritance interface constraints

que - Heredar de una clase base genérica, aplicar una restricción e implementar una interfaz en C#



polimorfismo c# (3)

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

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

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.

Esto es lo que tengo:

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

Lo primero que se me vino a la mente fue esto:

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

Pero eso es incorrecto ya que hace que T2 necesite implementar tanto IBar como 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.


Mi recomendación: cuando tenga una pregunta sobre la sintaxis del lenguaje C #, lea 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 en una declaración de clase es:

  • atributos, entre corchetes
  • modificadores ("público", "estático", etc.)
  • "parcial"
  • "clase"
  • el nombre de la clase
  • una lista separada por comas de declaraciones de parámetros de tipo dentro de corchetes angulares
  • dos puntos seguían una lista de tipos base separados por comas (clase base e interfaces implementadas, la clase base debe ir primero si hay una)
  • escriba restricciones de parámetros
  • el cuerpo de la clase, rodeado de 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.


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