2008-10-23 9 views
34

¿Es posible que el tipo de una interfaz genérica se base en una clase principal específica?¿Los genéricos Can C# tienen un tipo base específico?

Por ejemplo:

public interface IGenericFace<T : BaseClass> 
{ 
} 

Obviamente el código anterior no funciona, pero si lo hizo, lo que estoy tratando de decirle al compilador es que T debe haber 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.

Respuesta

81
public interface IGenericFace<T> where T : SomeBaseClass 
+2

Puede encontrar más información sobre cómo limitar el tipo en http://msdn.microsoft.com/en-us/library/d5x73970(VS.80).aspx – tvanfosson

+0

@Kyralessa, ¿es posible tener una clase de base genérica – Demodave

5

sí.

public interface IGenericFace<T> 
    where T : BaseClass 
{ 
} 
+4

? Esto debería eliminarse, no veo cómo está agregando nada. Kyralessa ya respondió esto. –

59

Lo que su referimos a que se llama "Las 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 de tipo debe ser un tipo de valor. Se puede especificar cualquier tipo de valor, excepto Nullable. Vea Using Nullable Types (C# Programming Guide) para 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ón new() 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 para T debe ser o derivar del argumento proporcionado para U. Esto se llama restricción de tipo desnudo.

Estos también pueden ser unidos entre sí de esta manera:

C#

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) 
Cuestiones relacionadas