Реализация интерфейса через наследование - PullRequest
1 голос
/ 18 декабря 2011

У меня есть интерфейс, который требует реализации оператора квадратных скобок. Класс, который наследует от этого, реализует это. Однако он также наследует от Dictionary <>, где реализован тот же оператор:

public interface IFoo
{
    IBar this[String tFooName] { get; }
}


[Serializable]
public class ConcreteFoo: Dictionary<String, Bar>, IFoo
{
    // Implement interface by calling the dictionary
    public IBar this[String tFooName] { get { return this[tFooName]; } }



    // .... more code ....
}

Когда я пытаюсь использовать код, компилятор ссылается на непосредственный интерфейс, который был реализован, и говорит, что я не могу назначить ему:

MyClass[tKeyStr] = new Bar();

Ошибка правильная. Итак, я удалил свою реализацию интерфейса IFoo и надеялся, что, наследуя от Dictionary <>, он будет реализован автоматически. Это не получилось так, как я хотел.

Я получаю сообщение об ошибке "не реализуется элемент интерфейса ...".

Как бы я решил эту проблему, не превращая словарь в личный член ?? Есть ли способ?

1 Ответ

4 голосов
/ 18 декабря 2011

Действительно ли нужно для получения из Dictionary<string, Bar>?По моему опыту, редко бывает полезно извлечь непосредственно из Dictionary<TKey, TValue>, List<T> и т. Д. - только коллекции, которые были явно разработаны для наследования (например, Collection<T>) обычнохорошо подходит для наследования.

Разве вы не можете просто заставить ваше ConcreteFoo иметь Dictionary<string, Bar> поле ?Вы как бы намекаете на это в своем последнем вопросе, но неясно почему вы пытаетесь использовать наследование вместо композиции.

Если вы действительно должны использоватьНаследование, вы можете использовать явную реализацию интерфейса , например:

IBar IFoo.this[String tFooName] { get { return this[tFooName]; } }

... но я бы предложил вместо этого композицию.

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