2010-11-11 25 views
5
class Base 
{} 

class Sub : Base 
{} 


void AddNewBase(Base t, LinkedList<Base> list){ ... } 
... 
{ 

    Sub asub = new Sub(); 

    LinkedList<Sub> asubList = new LinkedList<Sub>(); 
    AddNewBase(asub,asubList) // doesn't work 
} 

básicamente, tengo una función de inserción personalizado que toma un nuevo elemento y una lista de ponerlo en, y lo hace un poco de materia 'clasificar' para encontrar un buen lugar para ponerlo en el lista.C# polimorfismo en tipos genéricos

problema es que quiero hacer esto basándome en las propiedades en 'Base' así que sería bueno tener solo una función que podría hacer esto para todas las listas de subtipos.

Creo que lo que tipo de deseo es:

static void AddNewBase<T>(T t, LinkedList<T> list){ ... } 

pero con cierta forma de clarificar T como: 'donde T es una subclase de base'

+1

No hay plantillas en C#. – dtb

+0

¿qué versión? C# 4 y .NET 4 tienen formas de hacerlo. Las versiones anteriores no tienen. –

+2

En este caso .NET 4.0 no ayuda mucho, porque 'LinkedList ' no es covariante ni contravariante. En general, necesita que el tipo genérico sea de "solo lectura" (por ejemplo, "IEnumerable ") o "solo escritura" (por ejemplo, "Acción ") para permitir la covarianza o la contravarianza. – stevemegson

Respuesta

0

Puede usar donde la palabra clave es igual y no necesita un tipo genérico.

Aquí es la implementación IComparable que probablemente es lo que podría estar buscando en un problema de clasificación clásica:

static void AddNewBase<T>(T t, LinkedList<T> list) where T : IComparable 
    { 
     // 
    } 
0

En C# 4, puede utilizar la covarianza para hacer este trabajo. Sin embargo, debe seleccionar de una de las interfaces de colección genéricas covariantes. Por ejemplo, redeclarandolos su método:

static void AddNewBase(Base t, IEnumerable<Base> list) { //... } 

permitiría que llame AddNewBase con un LinkedList<Sub>.