Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему запечатывать можно только методы и свойства, и свойства? 
V
    Опции темы
Gunslinger
Дата 23.8.2010, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



В мсдн пишут, что запечатывать можно только классы, свойства и методы. Какие причины? Например, если я запечатаю класс, в котором будут индексаторы и\или события?
PM MAIL   Вверх
azesmcar
Дата 23.8.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(Gunslinger @  23.8.2010,  08:27 Найти цитируемый пост)
запечатывать 

если ты это про серилизацию, то объясни что означает серилизация индексатора?

PM   Вверх
jonie
Дата 23.8.2010, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



azesmcar, думаю речь про sealed спецификатор


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 23.8.2010, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(jonie @  23.8.2010,  08:47 Найти цитируемый пост)
azesmcar, думаю речь про sealed спецификатор 

эээ..тогда я вообще не понимаю вопроса.
хотя и до этого не особо понятно было smile 
PM   Вверх
mrbrooks
Дата 23.8.2010, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Цитата(jonie @  23.8.2010,  09:47 Найти цитируемый пост)
azesmcar, думаю речь про sealed спецификатор 

хы. а почему такой вывод камрад?
PM MAIL   Вверх
Gunslinger
Дата 23.8.2010, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(azesmcar @  23.8.2010,  08:31 Найти цитируемый пост)
если ты это про серилизацию

да, я про sealed. Думал запечатать=sealed=запрет наследования\переопределения в наследнике.
Кусок мсдн:
Модификатор sealed  можно использовать для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе.

но sealed можно и не к virtual методам,свойствам применить.

Это сообщение отредактировал(а) Gunslinger - 23.8.2010, 09:05
PM MAIL   Вверх
mrbrooks
Дата 23.8.2010, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Gunslinger, сам переводишь документацию? 
PM MAIL   Вверх
Gunslinger
Дата 23.8.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(mrbrooks @  23.8.2010,  09:04 Найти цитируемый пост)
Gunslinger, сам переводишь документацию? 

не, ее уже перевелиsmile
PM MAIL   Вверх
ДобренькийПапаша
Дата 23.8.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(Gunslinger @ 23.8.2010,  08:27)
В мсдн пишут, что запечатывать можно только классы, свойства и методы. Какие причины? Например, если я запечатаю класс, в котором будут индексаторы и\или события?

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

Кстати, Трэй Нэш рекомендует всегда по умолчанию объявлять класс как sealed (ещё говорят не запечатанный, а герметезированный).


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
azesmcar
Дата 23.8.2010, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(Gunslinger @  23.8.2010,  09:03 Найти цитируемый пост)
да, я про sealed. Думал запечатать=sealed=запрет наследования.

а с чего ты решил, что selaed не применяется к индексаторам?

Добавлено через 50 секунд
http://msdn.microsoft.com/en-us/library/aa664459(VS.71).aspx

Добавлено через 2 минуты и 7 секунд
держи пример
Код

class A
{
    virtual public int this[int x]
    {
        get { return 10; }
    }
}

class B : A
{
    sealed override public int this[int x]
    {
        get { return 20; }
    }
}

class C : B
{
    override public int this[int x]
    {
        get { return 30; }
    }
}


PM   Вверх
mrbrooks
Дата 23.8.2010, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Цитата(Gunslinger @  23.8.2010,  10:06 Найти цитируемый пост)
не, ее уже перевели

да я так и понял. просто пока писал, ты уже на это намекнул.  smile 

Цитата(mrbrooks @  23.8.2010,  10:03 Найти цитируемый пост)
хы. а почему такой вывод камрад? 

вопрос снимаю.

тогда по сабжу - неужели не хватает разъяснения в документации? smile

Добавлено через 1 минуту и 4 секунды
Цитата(ДобренькийПапаша @  23.8.2010,  10:06 Найти цитируемый пост)
Кстати, Трэй Нэш рекомендует

не только он.
PM MAIL   Вверх
Gunslinger
Дата 23.8.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



"С# 2008 для профессионалов. Платформа Net 3.5"
и
http://msdn.microsoft.com/ru-ru/library/88c54tsw.aspx
Сказано, что sealed может быть использован для методов, свойств, классов. Про индексаторы, события, операторы и тд. ни слова. 
Причем в отношении методов и свойств sealed может использоваться только в сочетании с override. Для свойств,методов sealed значит,что их нельзя переопределить в наследнике. Тогда: 
Код

class A
{
   virtual void F() { Console.WriteLine("class A") };
}
class B : A
{
   sealed override void F() { Console.WriteLine("class B") };
}

Метод F() класса B нельзя переопределить, если мы захотим наследовать от B. Какой в этом смыл? Т.е. F() уже становится "обычным", не виртуальным методом - его и так уже нельзя будет переопределить в наследнике от B.

Это сообщение отредактировал(а) Gunslinger - 23.8.2010, 11:53
PM MAIL   Вверх
KelTron
Дата 23.8.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата(Gunslinger @  23.8.2010,  10:15 Найти цитируемый пост)
Но если объявляю запечатанным сам класс, то вручную все его содержимое должен пометить как sealed?

Нет

Цитата(Gunslinger @  23.8.2010,  10:15 Найти цитируемый пост)
В той же книге тоже упоминаются только методы и свойства.

Индексатор это свойство


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
diadiavova
Дата 23.8.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(Gunslinger @  23.8.2010,  11:15 Найти цитируемый пост)
Но если объявляю запечатанным сам класс, то вручную все его содержимое должен пометить как sealed?

Ты просто не сможешь его унаследовать, компилятор будет матюгаццо.
Цитата(Gunslinger @  23.8.2010,  11:15 Найти цитируемый пост)
сказано только про классы, свойства и методы. Поискал еще - упоминаются еще и события.

Индексаторы - это тоже свойства, только с параметрами.


Это сообщение отредактировал(а) diadiavova - 23.8.2010, 11:39


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Gunslinger
Дата 23.8.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Пока переписывал пост ответили. Значит про индексаторы не написано, потомуч то это тоже свойство. В итоге запечатать можно только свойство, индексатор, метод и класс?

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

PM MAIL   Вверх
ДобренькийПапаша
Дата 23.8.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(Gunslinger @  23.8.2010,  10:15 Найти цитируемый пост)
Какой в этом смыл? Т.е. F() уже становится "обычным", не виртуальным методом - его и так уже нельзя будет переопределить в наследнике от B.


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

Код

class cl
        {
            public virtual void AnMethod()
            {
                return;
            }
        }
        class AnClass:cl
        {
            public override void AnMethod()
            {
                return;
            }
        }

        class Derived : AnClass
        {
            public override void AnMethod()           //Можно переопределить
            {
                return;
            }
        }


Код

class cl
        {
            public virtual void AnMethod()
            {
                return;
            }
        }
        class AnClass:cl
        {
            public override sealed void AnMethod()
            {
                return;
            }
        }

        class Derived : AnClass
        {
            public override void AnMethod()      //Error    1: cannot override inherited member AnClass.AnMethod() because it is sealed
            {
                return;
            }
        }



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Gunslinger
Дата 23.8.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(ДобренькийПапаша @  23.8.2010,  16:35 Найти цитируемый пост)
sealed в наследнике указываем, чтобы, опять же, явно сказать, что в следующем наследнике по иерархии этот метод нельзя переопределить. 

То есть переопределенный метод так же и виртуальный по умолчанию? 
Виртуальными методы делают,чтобы единообразно работать с объектами различных классов-наследников одного и того же базового класса. Зачем делать так: "в следующем наследнике по иерархии этот метод нельзя переопределить", когда можно унаследоваться от самого базового класса - cl? Только если нужно все содержимое промежуточного класса (AnClass)? Вроде изменить функционал, не копируя вручную содержимое существующего класса? Например:
Car, Mazda : Car, Mazda2 : Mazda?


PM MAIL   Вверх
ДобренькийПапаша
Дата 23.8.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(Gunslinger @  23.8.2010,  17:25 Найти цитируемый пост)
То есть переопределенный метод так же и виртуальный по умолчанию? 

Да.

Цитата(Gunslinger @  23.8.2010,  17:25 Найти цитируемый пост)
Зачем делать так: "в следующем наследнике по иерархии этот метод нельзя переопределить", когда можно унаследоваться от самого базового класса - cl?


Очевидно, чтобы унаследовать все члены иерархии. Если унаследуем только самый старший класс, то промежуточный унаследован не будет (а он вероятно добавил свои методы...)



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Gunslinger
Дата 24.8.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(ДобренькийПапаша @  23.8.2010,  19:10 Найти цитируемый пост)
Цитата(Gunslinger @  23.8.2010,  17:25 Найти цитируемый пост)
То есть переопределенный метод так же и виртуальный по умолчанию? 
Да.

Прикольная фишка. В с++ о такой, кажется, не было - в учебниках не встречал. Эта фишка только си шарпа или общая у языков со сборщиком мусора и байт-кодом, как, например, словари и списки?

Цитата(diadiavova @  23.8.2010,  11:30 Найти цитируемый пост)
Ты просто не сможешь его унаследовать, компилятор будет матюгаццо.


Цитата(KelTron @  23.8.2010,  11:30 Найти цитируемый пост)
Индексатор это свойство 

Спасибо.
Но если под свойствами подразумевались и индексаторы, то под методами подразумеваются только методы, или еще события, делегаты, операторы? Ведь с технической точки зрения это тоже методы. 
PM MAIL   Вверх
KelTron
Дата 24.8.2010, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата(Gunslinger @  24.8.2010,  12:37 Найти цитируемый пост)
Но если под свойствами подразумевались и индексаторы, то под методами подразумеваются только методы, или еще события, делегаты, операторы? Ведь с технической точки зрения это тоже методы. 

Оператор - если ты имеешь в виду перегрузку операторов - реализуется в виде функции. Делегат это класс.
http://msdn.microsoft.com/ru-ru/library/900fyy8e.aspx
Цитата

Ключевое слово delegate используется для объявления ссылочного типа, который может быть использован для инкапсуляции именованного или анонимного метода.

Ключевое слово event просто синтаксический сахар, чтобы меньше писать.

http://forum.vingrad.ru/forum/topic-73975.html
http://dev4food.ru/2010/02/kovarnyj-vopros-po-eventdelegate/


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
diadiavova
Дата 24.8.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(Gunslinger @  24.8.2010,  13:37 Найти цитируемый пост)
Но если под свойствами подразумевались и индексаторы

Индексаторы и есть свойства. В бейсике, например, для объявления индексатора даже используется слово Property, хотя компилируется он в то же, во что компилируются индексаторы в шарпе. В рефлексии доступ к индексаторам можно получить так же, как к любым другим свойствам. Просто в шарпе не поддерживаются никакие параметризированные свойства кроме индексаторов, из-за этого синтаксис для их объявления несколько упрощен, но от этого они не перестают быть свойствами. 
Цитата(Gunslinger @  24.8.2010,  13:37 Найти цитируемый пост)
события

События вполне могут быть виртуальными
http://msdn.microsoft.com/ru-ru/library/8627sbea.aspx

Цитата(Gunslinger @  24.8.2010,  13:37 Найти цитируемый пост)
операторы

 smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Gunslinger
Дата 25.8.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



ок.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.