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 paraTdebe ser o derivar del argumento proporcionado paraUEsto 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