| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Почему запечатывать можно только методы и свойства |
| Автор: Gunslinger 23.8.2010, 08:27 |
| В мсдн пишут, что запечатывать можно только классы, свойства и методы. Какие причины? Например, если я запечатаю класс, в котором будут индексаторы и\или события? |
| Автор: azesmcar 23.8.2010, 08:31 |
если ты это про серилизацию, то объясни что означает серилизация индексатора? |
| Автор: jonie 23.8.2010, 08:47 |
| azesmcar, думаю речь про sealed спецификатор |
| Автор: azesmcar 23.8.2010, 08:54 |
эээ..тогда я вообще не понимаю вопроса. хотя и до этого не особо понятно было |
| Автор: mrbrooks 23.8.2010, 09:03 |
хы. а почему такой вывод камрад? |
| Автор: Gunslinger 23.8.2010, 09:03 |
да, я про sealed. Думал запечатать=sealed=запрет наследования\переопределения в наследнике. Кусок мсдн: Модификатор sealed можно использовать для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе. но sealed можно и не к virtual методам,свойствам применить. |
| Автор: mrbrooks 23.8.2010, 09:04 |
| Gunslinger, сам переводишь документацию? |
| Автор: Gunslinger 23.8.2010, 09:06 |
не, ее уже перевели |
| Автор: ДобренькийПапаша 23.8.2010, 09:06 | ||
И что? Модификатор sealed означает, что класс (метод, свойство), не может быть унаследовано. Исходя из этого определения, непонятен смысл вашего вопроса. Кстати, Трэй Нэш рекомендует всегда по умолчанию объявлять класс как sealed (ещё говорят не запечатанный, а герметезированный). |
| Автор: mrbrooks 23.8.2010, 09:10 |
да я так и понял. просто пока писал, ты уже на это намекнул. вопрос снимаю. тогда по сабжу - неужели не хватает разъяснения в документации? Добавлено через 1 минуту и 4 секунды не только он. |
| Автор: Gunslinger 23.8.2010, 10:15 | ||
| "С# 2008 для профессионалов. Платформа Net 3.5" и http://msdn.microsoft.com/ru-ru/library/88c54tsw.aspx Сказано, что sealed может быть использован для методов, свойств, классов. Про индексаторы, события, операторы и тд. ни слова. Причем в отношении методов и свойств sealed может использоваться только в сочетании с override. Для свойств,методов sealed значит,что их нельзя переопределить в наследнике. Тогда:
Метод F() класса B нельзя переопределить, если мы захотим наследовать от B. Какой в этом смыл? Т.е. F() уже становится "обычным", не виртуальным методом - его и так уже нельзя будет переопределить в наследнике от B. |
| Автор: KelTron 23.8.2010, 11:30 | ||
Нет Индексатор это свойство |
| Автор: diadiavova 23.8.2010, 11:30 | ||||
Ты просто не сможешь его унаследовать, компилятор будет матюгаццо.
Индексаторы - это тоже свойства, только с параметрами. |
| Автор: Gunslinger 23.8.2010, 11:47 |
| Пока переписывал пост ответили. Значит про индексаторы не написано, потомуч то это тоже свойство. В итоге запечатать можно только свойство, индексатор, метод и класс? з.ы. было бы неплохо добавить возможность блокировки написания ответов, пока перередактируешь пост. А то потратил время на ответ, а потом оказывается, что пост изменен. |
| Автор: ДобренькийПапаша 23.8.2010, 16:35 | ||||||
sealed в наследнике указываем, чтобы, опять же, явно сказать, что в следующем наследнике по иерархии этот метод нельзя переопределить. Это проектировочное решение.
|
| Автор: Gunslinger 23.8.2010, 17:25 | ||
То есть переопределенный метод так же и виртуальный по умолчанию? Виртуальными методы делают,чтобы единообразно работать с объектами различных классов-наследников одного и того же базового класса. Зачем делать так: "в следующем наследнике по иерархии этот метод нельзя переопределить", когда можно унаследоваться от самого базового класса - cl? Только если нужно все содержимое промежуточного класса (AnClass)? Вроде изменить функционал, не копируя вручную содержимое существующего класса? Например: Car, Mazda : Car, Mazda2 : Mazda? |
| Автор: ДобренькийПапаша 23.8.2010, 19:10 | ||||
Да.
Очевидно, чтобы унаследовать все члены иерархии. Если унаследуем только самый старший класс, то промежуточный унаследован не будет (а он вероятно добавил свои методы...) |
| Автор: Gunslinger 24.8.2010, 12:37 | ||||
Прикольная фишка. В с++ о такой, кажется, не было - в учебниках не встречал. Эта фишка только си шарпа или общая у языков со сборщиком мусора и байт-кодом, как, например, словари и списки?
Спасибо. Но если под свойствами подразумевались и индексаторы, то под методами подразумеваются только методы, или еще события, делегаты, операторы? Ведь с технической точки зрения это тоже методы. |
| Автор: KelTron 24.8.2010, 13:21 | ||||
Оператор - если ты имеешь в виду перегрузку операторов - реализуется в виде функции. Делегат это класс. http://msdn.microsoft.com/ru-ru/library/900fyy8e.aspx
Ключевое слово event просто синтаксический сахар, чтобы меньше писать. http://forum.vingrad.ru/forum/topic-73975.html http://dev4food.ru/2010/02/kovarnyj-vopros-po-eventdelegate/ |
| Автор: diadiavova 24.8.2010, 14:12 |
Индексаторы и есть свойства. В бейсике, например, для объявления индексатора даже используется слово Property, хотя компилируется он в то же, во что компилируются индексаторы в шарпе. В рефлексии доступ к индексаторам можно получить так же, как к любым другим свойствам. Просто в шарпе не поддерживаются никакие параметризированные свойства кроме индексаторов, из-за этого синтаксис для их объявления несколько упрощен, но от этого они не перестают быть свойствами. События вполне могут быть виртуальными http://msdn.microsoft.com/ru-ru/library/8627sbea.aspx |
| Автор: Gunslinger 25.8.2010, 12:29 |
| ок. |