Интерфейс против внутренней переменной против словаря наследования - PullRequest
2 голосов
/ 26 августа 2011

Я прочитал

Когда я должен выбирать наследование по интерфейсу при разработке библиотек классов C #?

Мне кажется, я понимаю, что отношения "обязательны" и "обязательны",Сказав все это, вот моя дилемма.

Я хочу реализовать коллекцию пар ключ-значение наиболее вероятный объект.Мне нужно добавлять в события добавления и удаления только проверку, проверку на дублирование и некоторые другие вещи для отслеживания.

Если я реализую IDictionary, то кажется, что реализовать все Idictionary - это немного перебор.>, ICollection <>, IEnumerable <> и IEnumerable.Да, большинство из них являются однострочниками.

Не рекомендуется наследовать от словаря, поскольку его никогда не предполагалось расширять, затеняя добавление и удаление.

Наконец, я могу просто реализовать частныйпеременной, а затем выставьте методы, которые я хочу или нуждаюсь для проекта

Есть предложения о направлении?

Ответы [ 4 ]

2 голосов
/ 26 августа 2011

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

Вы должны реализовать IDictionary<,> или наследовать от Dictionary<,>, если ваш класс - универсальный словарь с некоторыми специальными характеристиками.

0 голосов
/ 30 августа 2011

Я хотел бы предложить, возможно, разработать некоторые из ваших собственных интерфейсов словаря, которые включают в себя интересующую вас функциональность. Среди прочего, я бы предложил иметь некоторые интерфейсы, которые существуют исключительно для чтения интерфейса, и некоторые, которые позволяют читать доступ для записи. Среди прочего, если у вас есть интерфейс только для чтения, методы, которым все равно, является ли конкретный словарь изменяемым или неизменным, смогут использовать IReadableDict (реализуемый как изменяемыми, так и неизменяемыми словарями), в то время как подпрограммы, которые требуют либо словарь должен быть изменяемым или что он будет неизменным, сможет указать это. Кроме того, выделение некоторых других интерфейсов даст максимальные возможности для ковариации и контравариантности. Например, код, ожидающий IReadableDict , может быть полностью доволен Dict , даже если код, который ожидает IReadWriteDict , не сможет принять Dict . Аналогично, код, которому нужно знать только количество словарей, может принимать неуниверсальный ICountable, который предоставляет метод Count, а код, которому нужно только знать, существует ли определенный ключ, может принимать неуниверсальный IQueryExistence (обратите внимание, что можно совершенно законно проверить, содержит ли Dict конкретный экземпляр Dog; ответ будет «нет», но вопрос верен).

0 голосов
/ 26 августа 2011

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

0 голосов
/ 26 августа 2011

Самый простой подход - реализовать IDictionary в качестве переменной экземпляра и обернуть методы Add и Remove в методы Add и Remove вашего класса, которые выполняют проверку перед добавлением или удалением объекта в словарь или из него.

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