c# - marca - medicamentos genericos listado
¿Pueden los genéricos de C#tener un tipo base específico? (4)
¿Es posible que el tipo de una interfaz genérica se base en una clase principal específica?
Por ejemplo:
public interface IGenericFace<T : BaseClass>
{
}
Obviamente, el código anterior no funciona, pero si lo hizo, lo que intento decirle al compilador es que T
debe ser una subclase de BaseClass
. ¿Se puede hacer eso, hay planes para ello, etc.?
Creo que sería útil en términos de un proyecto específico, asegurándose de que una clase / interfaz genérica no se utilice con tipo (s) no deseado (s) en el momento de la compilación. O también a una especie de auto-documento: mostrar qué tipo de tipo está destinado.
A lo que se está refiriendo se le llama "Restricciones genéricas". Existen numerosas restricciones que se pueden poner en un tipo genérico.
Algunos ejemplos básicos son los siguientes:
where T: struct
- El argumento tipo debe ser un tipo de valor. Cualquier tipo de valor exceptoNullable
- se puede especificar. Consulte Uso de tipos anulables (Guía de programación C #) para obtener más información.where T : class
- El argumento tipo debe ser un tipo de referencia; esto se aplica también a cualquier clase, interfaz, delegado o tipo de matriz.where T : new()
- El argumento tipo debe tener un constructor público sin parámetros. Cuando se usa junto con otras restricciones, la restricciónnew()
debe especificarse al final.where T : <base class name>
- El argumento de tipo debe ser o derivar de la clase base especificada.where T : <interface name>
- El argumento de tipo debe ser o implementar la interfaz especificada. Se pueden especificar múltiples restricciones de interfaz. La interfaz restrictiva también puede ser genérica.where T : U
- El argumento de tipo suministrado paraT
debe ser o derivar del argumento proporcionado paraU
Esto se llama restricción de tipo desnudo.
Estos también pueden vincularse de esta manera:
DO#
public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { }
public interface IGenericFace<T> where T : SomeBaseClass
VB
Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New})
Public Interface IGenericInterface(Of T As SomeBaseClass)
Más información sobre interfaces genéricas: http://msdn.microsoft.com/en-us/library/kwtft8ak(VS.80).aspx
sí.
public interface IGenericFace<T>
where T : BaseClass
{
}
public interface IGenericFace<T> where T : SomeBaseClass