Почему ключевое слово «sealed» существует в .Net?

Привет Вот мой код, чтобы найти самый длинный палиндром в строке. Пожалуйста, обратитесь к следующей ссылке, чтобы понять алгоритм http://stevekrenzel.com/articles/longest-palnidrome

Используемые тестовые данные: HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE

 //Function GetPalindromeString

public static string GetPalindromeString(string theInputString)
 { 

        int j = 0;
        int k = 0;
        string aPalindrome = string.Empty;
        string aLongestPalindrome = string.Empty ;          
        for (int i = 1; i < theInputString.Length; i++)
        {
            k = i + 1;
            j = i - 1;
            while (j >= 0 && k < theInputString.Length)
            {
                if (theInputString[j] != theInputString[k])
                {
                    break;
                }
                else
                {
                    j--;
                    k++;
                }
                aPalindrome = theInputString.Substring(j + 1, k - j - 1);
                if (aPalindrome.Length > aLongestPalindrome.Length)
                {
                    aLongestPalindrome = aPalindrome;
                }
            }
        }
        return aLongestPalindrome;     
  }

13
задан X-Cubed 16 February 2009 в 23:50
поделиться

8 ответов

Разработка классов (или платформы), чтобы быть расширяемой не тривиальна, и помещенная, просто наследование не является единственным принципом Объектно-ориентированного программирования.

Так sealed существует, чтобы позволить разработчику / разработчик выражать и сохранять те намерения. Изоляция класса может также сделать их жизнь легче путем сокращения нагрузки обслуживания. Это позволяет исходному разработчику управлять, как класс (или платформа) расширяется, таким образом, они могут внести внутренние изменения, не волнуясь о повреждении изменений в коде других.

Один принцип - то, что разработчики должны изолировать любой лист классы по умолчанию. Затем когда разработчик создает негерметизированный класс намеренно, он вынуждает их думать о расширяемости.

<час>

Касательно: Eric Lippert - , Почему Изолированы Столь многие Классы Платформы?

22
ответ дан Robert Paulson 17 February 2009 в 09:50
поделиться

Этот ответ от несколько связанного вопроса, который я задал сегодня, мог бы помочь разъяснить цели изолировать класс:

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

, позволяя Вашему классу быть расширенными, необходимо спросить: если разработчик расширяет мой класс и передает этот новый класс моей библиотеке, я могу прозрачно работать с этим новым классом? Я могу работать правильно с этим новым классом? Этот новый класс действительно собирается вести себя то же?

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

Liskov Substition и Состав

Теперь переходят по той ссылке и upvote фактический автор.

7
ответ дан Community 17 February 2009 в 09:50
поделиться

Короткий ответ, потому что Microsoft заявила так. Более длинный ответ - то, что Microsoft обеспечила механизм для расширения запечатанных классов, методов вызываемого внутреннего абонента.

В целом, это - плохая идея расширить классы который, к которому у Вас нет исходного кода. Например, Вы не знаете то, что вызов базового метода делает к внутренним данным объекта. Да, можно использовать отражатель или безотносительно понимать это, но в целом намного лучше использовать состав или дополнительные методы.

также необходимо рассмотреть, каково наследование на самом деле. Это не просто способ изменить класс, это также обеспечивает полиморфизм. Что при изменении семантики, скажем, строкового класса, затем Вы передаете свой новый строковый класс объекту, который ожидает, что строка будет действовать в особенном методе? изолированный по существу осуществляет контракт, что этот объект будет всегда работать способ, к которому Вы ожидаете это.

2
ответ дан Erik Funkenbusch 17 February 2009 в 09:50
поделиться

Не роя слишком глубоко, поймите, что польза Microsoft, изолирующая класс, когда существует потенциальная безопасность, пригодность для обслуживания или назад-проблемы-совместимости, что это должно будет иметь дело с нисходящим потоком. Например, System.String изолируется по причинам производительности и безопасности.

В данном случае, необходимо было бы спросить разработчика Microsoft, почему они приняли решение изолировать тот класс. Однако архитектурная литература руководства, которую я читал в последнее время, имеет тенденцию способствовать подходу "изоляции, если Вы не будете знать , это должно будет быть расширено". Эта литература имеет тенденцию поддерживать использующие дополнительные методы, если это возможно. (Я не говорю, что соглашаюсь с ним; я просто говорю, что это - то, что я читал в последнее время.)

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

В Вашем определенном сценарии, я пошел бы с дополнительными методами с Вашими собственными уникальными именами. Это обо всем, что можно сделать.

2
ответ дан John Rudy 17 February 2009 в 09:50
поделиться
  • 1
    В документации говорится что setMaxAdministrativeTime значения по умолчанию 0 (т.е. навсегда). Кроме того, почему мне придется возвратить соединение с пулом в какой-либо установленный срок? I' ve проверил его; это должно быть моим столько, сколько мне нужен он... и даже если не, that' s не мертвая блокировка! – Steven Schlansker 17 September 2010 в 10:59

В то время как я действительно соглашаюсь, что.NET, вероятно, изолирует слишком много, она должна обычно защищать целостность экосистемы. Когда один из Ваших высших приоритетов должен сохранить стабильность Вашей полной платформы/API/времени выполнения, и существуют несколько хрупкие взаимозависимости между классами, может быть самым безопасным препятствовать тому, чтобы люди переопределили то поведение и непреднамеренно дестабилизировали базовую функциональность.

, Хотя снова, я действительно склонен чувствовать, что команда.NET изолирует слишком много классов. Изоляция может иногда быть простой ленью со стороны разработчика, потому что надлежащий дизайн класса был бы слишком большой работой.

1
ответ дан Rex M 17 February 2009 в 09:50
поделиться
  • 1
    Вы правы, that' s, почему ПРЕДУПРЕЖДЕНИЕ говорит ОЧЕВИДНУЮ мертвую блокировку. И между прочим, Вы используете пул соединения, таким образом, Вы не должны сохранять соединение, в то время как Вы не используете его – Thomas Weber 17 September 2010 в 11:02

Я предположил бы, что нет никакого серьезного основания для изоляции классов кроме защитить неосведомленное - допускают ошибку, я имею в виду невинный. Вы знаете старую поговорку, "данный их достаточно веревки и они подвесят себя". Позвольте им колебаться, я говорю. Возможно, это - мое образование C++, но я - довольно удобное знание, что я имею право полностью наполнять вещи, если я не прилежен.

я склонен программировать интерфейсом. Интерфейсы являются, конечно, открытыми, и любой свободен обеспечить их собственную реализацию, которая придерживается контракта, выраженного интерфейсом. Мои реальные классы, которые реализуют эти интерфейсы, имеют тенденцию быть частной фирмой и отмечены внутренние и/или частные. Я не чувствую, что должен изолировать такие классы.

, Где повторное использование кода желательно, я избегаю повторного использования посредством наследования, одобряя состав и другие методы.

Изоляция может также быть допустимой на типах, которые считают типами простых данных, но я не убежден, иссушают путь на этом.

1
ответ дан Daniel Paull 17 February 2009 в 09:50
поделиться
  • 1
    Несомненно, но рассматриваемое место могло быть в продолжительной транзакции; во время которого Вы не можете выпустить его. – Steven Schlansker 17 September 2010 в 11:03

Это зависит, существуют классы, которые предназначаются, чтобы быть просто инстанцированными (наследование, если существует, используется только для упрощения реализации), другие классы предназначаются, чтобы быть наследованными для обеспечения определенной реализации.

Запечатанные классы имеют некоторые преимущества:

  • у них нет виртуальных методов, таким образом, они не должны волноваться о не - "исключение - безопасные" реализованные методы переопределения.
  • , Если класс неизменен, он может сохранить и гарантировать неизменность.

Иначе, если Вы хотите украсить запечатанный класс методами "комфорта", используют дополнительные методы (C# 3.0).

0
ответ дан Michael Damatov 17 February 2009 в 09:50
поделиться
  • 1
    Это не должно вызывать проблему, по моему опыту, проверки C3P0, используется ли соединение активно. I' m не привыкший к использованию C3P0 непосредственно, я использую его с, в спящем режиме - но в этом сценарии, длинные транзакции никогда не являются проблемой, но бездействующие соединения вызывают предупреждение, что Вы получаете. – Thomas Weber 17 September 2010 в 11:07

Просто, потому что что-то - объект, это не означает, что это всегда должно быть широко открытым для всех для расширения, или переопределять это - поведение.

А хорошая аналогия была бы дверью и блокировкой. Характер двери состоит в том, чтобы позволить людям для прохождения через него, это - то, для чего это создается. Все же большинство дверей разработано с блокировками, которые могут ограничить способность людей пройти через них. Решение, имеет ли дверь блокировку и заблокирована ли та блокировка по умолчанию, оставлено архитектору комнаты, на основе того, что находится в комнате и у кого должен быть доступ к нему, не на том, что это - дверь.

, Конечно, может быть печально, если большинство дверей, в особенности создающих, заблокировано по умолчанию, особенно если существует тот, который Вы действительно хотите пройти.:-) Я был там мной, и я задал тот же вопрос. Короткий ответ - то, что иногда при разработке сложной платформы, люди склонны допускать ошибку немного на более осторожной стороне и изолировать классы по умолчанию, если нет явный сценарий, который требует, чтобы они были расширены.

0
ответ дан Franci Penov 17 February 2009 в 09:50
поделиться
  • 1
    Просто видел Ваше редактирование к вопросу. Тайм-аут, который Вы поражаете, установлен " ds.setMaxIdleTime (900) " – Thomas Weber 17 September 2010 в 11:09
Другие вопросы по тегам:

Похожие вопросы: