c # виртуальный словарь? - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть класс с объектом словаря. Любой класс, производный от этого класса, я хочу переопределить словарь с его собственной реализацией.

Как этого достичь, так как виртуальное ключевое слово здесь недопустимо?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 17 ноября 2010

У вас не может быть виртуальных полей, но вы можете иметь виртуальные свойства.

Кроме того, было бы неплохо объявить тип свойства для интерфейса IDictionary<TKey, TValue>, а не для Dictionary<TKey, TValue> конкретного типа, поскольку этот класс не предназначен для наследования.

например:

private readonly Dictionary<string, int> _myDictionary 
                  = new Dictionary<string, int>();

protected virtual IDictionary<string, int> MyDictionary 
{
   get
   {
      return _myDictionary; 
   }
}

Подклассы не увидят поле; будет видна только собственность Они могут переопределить свойство и обеспечить собственную реализацию; например, возвращая экземпляр пользовательского типа, который реализует интерфейс.

1 голос
/ 17 ноября 2010

Примерно так должно работать:

public class Base
{
    private Dictionary<string, string> dictionary = new Dictionary<string, string>();

    public virtual IDictionary<string, string> DictInstance
    {
        get { return this.dictionary; }
    }
}

public class Derived : Base
{
    private MySpecialDictionary otherDictionary = new MySpecialDictionary();

    public override IDictionary<string, string> DictInstance
    {
        get { return this.otherDictionary; }
    }
}
0 голосов
/ 17 ноября 2010

Вы можете объявить поле как IDictionary, тогда каждый подкласс инициализирует его с другой реализацией.Или сделайте так, как предлагает Ани.

0 голосов
/ 17 ноября 2010

Вы можете сделать переменную словаря приватной и обслуживать ее через виртуальный геттер. Производный класс не может полностью выбросить унаследованный член, только переопределить функции класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...