Класс наследует общий словарь <string, IFoo> и Interface - PullRequest
2 голосов
/ 30 ноября 2008

У меня есть класс, который наследует общий словарь и интерфейс

public class MyDictionary: Dictionary<string, IFoo>, IMyDictionary
{
}

проблема в том, что потребители этого класса ищут свойства интерфейса .Keys и .Values, поэтому я добавил:

    /// <summary>
    /// 
    /// </summary>
    ICollection<string> Keys { get; }

    /// <summary>
    /// 
    /// </summary>
    IEnumerable<IFoo> Values { get; }

к интерфейсу.

Теперь реализация должна иметь это, но когда я реализую их, я получаю эту ошибку:

"Ключевое слово new является обязательным, поскольку оно скрывает свойство Keys. .."

так что мне нужно сделать. Должен ли я добавить «новый» перед этими свойствами get?

Ответы [ 4 ]

6 голосов
/ 30 ноября 2008

Другой вариант - изменить типы интерфейса:

public interface IMyDictionary
{
    /// <summary>
    /// 
    /// </summary>
    Dictionary<string, IFoo>.KeyCollection Keys { get; }

    /// <summary>
    /// 
    /// </summary>
    Dictionary<string, IFoo>.ValueCollection Values { get; }
}

Таким образом, интерфейс уже реализован в словаре, избавляя вас от необходимости повторной реализации свойств, и он не скрывает и не покрывает исходную реализацию.

4 голосов
/ 30 ноября 2008

Dictionary реализует интерфейс IDictionary , который уже предоставляет свойства Keys и Values. Не должно быть необходимости создавать свои собственные свойства, но способ обойти предупреждение компилятора - добавить ключевое слово new в начале объявлений вашего свойства в вашем классе.

2 голосов
/ 30 ноября 2008

Вы также можете использовать явную реализацию интерфейса. Таким образом, если кто-то ссылается на MyDictionary с помощью интерфейса IMyDictionary, он увидит методы и ничего больше. Я бы также рекомендовал вместо этого реализовать IDictionary. Если вы не хотите ограничивать использование только ключами и значениями.

public class MyDictionary : Dictionary<string, IFoo>, IMyDictionary
{
    ICollection<string> IMyDictionary.Keys
    {
        get { return Keys; }
    }

    IEnumerable<IFoo> IMyDictionary.Values
    {
        get { return Values; }
    }
}
2 голосов
/ 30 ноября 2008

Причина в том, что ваши свойства ключей и значений скрывают реализацию свойств ключей и значений в классе Dictionary.

РЕДАКТИРОВАТЬ: Да, все, что вам нужно сделать, это добавить новое ключевое слово в вашу собственность. Таким образом, ваш код будет выглядеть примерно так:

class IFoo
{ }

interface MyDictionary
{
    ICollection<string> Keys { get; }

    /// <summary>
    /// 
    /// </summary>
    IEnumerable<IFoo> Values { get; }
}

class IStuff : Dictionary<string, IFoo>, MyDictionary
{
    #region MyDictionary Members

    //Note the new keyword.
    public new ICollection<string> Keys
    {
        get { throw new NotImplementedException(); }
    }

    public new IEnumerable<IFoo> Values
    {
        get { throw new NotImplementedException(); }
    }

    #endregion
}

Я все равно рекомендую реализовать IDictionary.

...