Почему Список <T>не запечатан? - PullRequest
23 голосов
/ 25 января 2011

Этот вопрос пришел в голову после прочтения ответа на этот вопрос;что в основном указывало на то, что List<T> не имеет виртуальных методов, поскольку он был разработан как «быстрый, а не расширяемый».

Если это и есть цель дизайна, то почему оригинальный дизайн не включал герметизацию класса?(Я знаю, что сейчас это невозможно, видя, как это может нарушить множество дочерних классов в клиентском коде)

Ответы [ 2 ]

15 голосов
/ 25 января 2011

Нет веских причин запечатывать его. Это не вредно, чтобы извлечь из этого. Раньше я придерживался противоположного мышления - оставляй только те вещи, которые ты собираешься открыть для людей. Но, оглядываясь назад, это не имеет смысла. .NET придерживается позиции, что методы не являются виртуальными по умолчанию, но классы по умолчанию незапечатаны. List<T> просто следует той же практике.

Где вы хотели бы запечатать класс, это когда он переопределяет виртуальные методы, но дальнейшее создание подклассов не просто и не очевидно. Может быть немного полезно получить из коллекции, такой как Dictionary<TKey,TValue>, чтобы придерживаться параметров известного типа и избегать их ввода, если они используются в приложении. Например, может быть, у вас есть класс QueryString, производный от Dictionary<String,String>.

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

2 голосов
/ 25 января 2011

Должно быть много причин, почему они решили не делать List<T> запечатанными, однако одна возможность состоит в том, что команда разработчиков Framework хотела паритета с ArrayList (который не запечатан), чтобы существующие программы и Frameworks, которые имели проекты на основе расширения ArrayList сможет более легко модернизировать свои проекты для использования List<T>. Создание List<T> запечатанного было бы настоящим тупиком для этих применений, и одним из сильных руководящих принципов проектирования было бы позволить людям легко обновить свои существующие кодовые базы с ArrayList до List<T>.

...