2009-10-20 6 views
13

Я хочу всю функциональность Dictionary<TKey,TValue>, но хочу, чтобы это было Foo<TKey,TValue>.
Как мне это сделать?
В настоящее время я используюКак я могу наследовать словарь?

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){} 

} 

Что такое правильный способ перегрузки конструкторов и методы родительского класса?

ПРИМЕЧАНИЕ: Я думаю, что я неправильно использовал слово «перегрузка», пожалуйста, исправьте его или предложите исправление.

+1

Вы говорите (в комментарии к моему ответу), что это реализация шаблона декоратора. Независимо от того, для чего он точно используется, я сомневаюсь, что вы должны наследовать словарь, даже не реализовывать IDictionary. Я думаю, вы должны просто написать обычный класс, который содержит (закрытый) словарь для управления своим состоянием и имеет некоторые методы добавления, удаления и получения. –

ответ

20

Вы были близки, вам просто нужно удалить параметры типа из конструкторов.

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

Чтобы переопределить метод, вы можете использовать ключевое слово переопределения.

+2

Не внутри конструкторов, нет ... они уже находятся внутри типа, поэтому они уже «имеют» параметры типа. –

+0

Нет, TKey и TValue теперь определены как часть класса. Вам не нужно переопределять их в каждом методе. –

+0

_and_ сделать их общедоступными, как правило. –

13

Непосредственно отвечая на ваш вопрос, просто совет. Я бы не наследовал словарь, я бы использовал IDictionary<T,K> и объединил словарь. Это наиболее вероятно, является лучшим решением:

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

    private Dictionary<TKey, TValue> myDict; 

    // ... 
} 
+0

(+1) Что вы рекомендуете, если я хочу использовать только словарь, но с именем Foo? –

+0

Зачем вам это делать? Какой-то тип typedef в стиле C? –

+0

Это декоратор (http://en.wikipedia.org/wiki/Decorator_pattern). Возможный недостаток: вам необходимо реализовать каждое соединение из своего класса в словарь участника вручную. –

1

Если вы просто хотите, один и тот же тип, но с другим именем, вы можете сократить его с using псевдоним:

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

, а затем

Foo f = new Foo(); 
Смежные вопросы