2009-10-20 9 views
13

Quiero toda la funcionalidad de Dictionary<TKey,TValue> pero la quiero como Foo<TKey,TValue>.
¿Cómo debo hacer esto?
Actualmente estoy usando¿Cómo heredo de Dictionary?

class Foo<TKey,TValue> : Dictionary<TKey, TValue> 
{ 
    /* 
    I'm getting all sorts of errors because I don't know how to 
    overload the constructors of the parent class. 
    */ 
    // overloaded methods and constructors goes here. 

    Foo<TKey,TValue>():base(){} 
    Foo<TKey,TValue>(int capacity):base(capacity){} 

} 

¿Cuál es la manera correcta de sobrecargar los constructores y los métodos de la clase padre?

NOTA: Creo que he abusado de la palabra 'sobrecarga' por favor, corregir o sugerir la corrección.

+1

Usted dice (en el comentario de mi respuesta) que es una implementación del patrón de decorador. Sea cual sea el uso exacto, dudo que deba heredar de Dictionary, ni siquiera implementar IDictionary. Creo que debería simplemente escribir una clase regular que contenga un diccionario (privado) para administrar su estado, y que tenga algunos tipos de métodos Agregar, Eliminar y Obtener. –

Respuesta

20

Usted estuvo cerca, solo necesita eliminar los parámetros de tipo de los constructores.

class Foo<TKey,TValue> : Dictionary<TKey, TValue> 
{ 
    Foo():base(){} 
    Foo(int capacity):base(capacity){} 
} 

Para anular un método, puede utilizar la palabra clave de anulación.

+2

No dentro de los constructores, no ... ya están dentro del tipo, por lo que ya "tienen" los parámetros de tipo. –

+0

No, TKey y TValue ahora se definen como parte de la clase. No necesita redefinirlos en cada método. –

+0

_y_ hacerlos públicos, por lo general. –

13

No respondiendo directamente a su pregunta, solo un consejo. No heredaría el diccionario, implementaría IDictionary<T,K> y agregaría un diccionario. Es más probable que una solución mejor:

class Foo<TKey,TValue> : IDictionary<TKey, TValue> 
{ 

    private Dictionary<TKey, TValue> myDict; 

    // ... 
} 
+0

(+1) ¿Qué me recomiendan si quiero usar solo el Diccionario pero con el nombre Foo? –

+0

¿Por qué harías esto? ¿Una especie de typedef tipo C? –

+0

That's a Decorator (http://en.wikipedia.org/wiki/Decorator_pattern). Posible inconveniente: debe implementar cada conexión de su clase a su diccionario miembro manualmente. –

1

Si lo que desea es del mismo tipo pero con un nombre diferente, se puede acortar con using alias:

using Foo = System.Collections.Generic.Dictionary<string, string>; 

y luego

Foo f = new Foo();