usando una tipo ser referencia poo parametros parametrizada objeto genericos generico generica debe cuando crear clase c# generics inheritance subclass derived-class

una - parametros genericos c#



En C#4.0, ¿es posible derivar una clase de un parámetro de tipo genérico? (3)

Cada tipo tiene exactamente 1 clase primaria, discreta, incluso cuando se trata de genéricos. Incluso cuando se trata de un tipo genérico abierto (p. Ej., typeof(List<>) ), aún puede encontrar la clase principal.

Si lo que deseaba estuviera permitido, esto no sería cierto, typeof(SingletonType<,> no tendría un tipo principal, y esto no está permitido.

He estado intentando esto, pero parece que no puedo resolver esto. Quiero hacer esto...

public abstract class SingletonType<T,U> : U where T : class, new() where U : class, new() // Tried it with and without this second ''new()'' { static T _Singleton; public static T Singleton{ get{ return _Singleton ?? (_Singleton = new T()); }} }

entonces puedo usarlo así ...

public class Foo : SingletonType<Foo, FooBase> { }

que de algún modo insertaría el patrón Singleton entre cualquier otro tipo de dos. Sin embargo, sigo recibiendo este error ...

No puede derivar de ''U'' porque es un parámetro de tipo

Um ... ¡pensé que los tipos eran exactamente de lo que se deriva!

Sin embargo, esto funciona, pero no es reutilizable (debido a FooBase) ...

public abstract class SingletonType<T> : FooBase where T : class, new() { static T _Singleton; public static T Singleton{ get{ return _Singleton ?? (_Singleton = new T()); }} }

Por ahora, la solución es simplemente no usar la clase genérica y en su lugar duplicar esas dos líneas en la clase real (quiero decir que realmente es así de simple cuando hay un constructor predeterminado público), pero todavía tengo curiosidad de por qué no lo hace t trabajo. Entonces, ¿qué me estoy perdiendo?


No, esto no es posible Por ejemplo, tome un tipo que se declare sealed . No puede heredar de esa clase, y no hay ninguna restricción para limitar a los tipos no sellados, por lo que es imposible tratar de heredar a través de un parámetro genérico.


Los tipos genéricos en C # no son plantillas C ++; recuerde, un tipo genérico debe funcionar para todos los posibles argumentos de tipo. Una plantilla solo necesita trabajo para las construcciones que realizas.

Esta pregunta es un duplicado; ver mi respuesta a

¿Por qué los genéricos C # no pueden derivarse de uno de los parámetros de tipo genérico como lo hacen en las plantillas C ++?

para más pensamientos sobre esto. Básicamente, la respuesta corta es que los considerables costos no superan los pequeños beneficios de la función. Si no te gusta esa respuesta, mira mi segunda respuesta:

¿Por qué los genéricos C # no pueden derivarse de uno de los parámetros de tipo genérico como lo hacen en las plantillas C ++?

Y si no te gusta esa respuesta tampoco, mira la pregunta de seguimiento:

¿Cuáles son las buenas razones para desear que los genéricos .NET puedan heredar uno de los tipos de parámetros genéricos?