Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Классы!


Страницы:   1 2

WondeRu ©   (2004-08-12 12:42:00) 

Здравствуйте!
Чем отличается следующий код? и где, что лучше применять?
1.
(Sender as TPanel).Handle


2.
 TPanel(Sender).Handle


Код Делфа генерит разный!!!

Заранее спасибо!


KSergey   (2004-08-12 13:23:00) [21]

> [5] _student   (12.08.04 13:21)

Да, да
Запостил, потом подумал ;)


KSergey   (2004-08-12 13:22:00) [22]

> [4] KSergey ©   (12.08.04 13:17)
> - по-моему понятно: если есть полная уверенность, что некая
> переменная в данном месте программы точно указанного типа
> либо его наследник - то можно применять второе; если такой
> уверенности нет - первое (важно делать надежные программы).

Читать так:

если есть полная (гарантированная!) уверенность, что некая переменная содержит ссылку на объект того же класса, к котрому приводится или его наследника - то можно применять второе;

и далее по тексту.


_student   (2004-08-12 13:21:00) [23]


> KSergey ©   (12.08.04 13:17) [4]

если типы объектов ....


KSergey   (2004-08-12 13:17:00) [24]

> [2] wicked ©   (12.08.04 12:59)
> в общем, совет: если нужно обратиться к свойству типа Handle
> или ClientRect, то кастить такой указатель лучше к классу,
> в котором это свойство и обьявлено... в данном случае это
> TWinControl...

По поводу общности совета совершенно не согласен.

> _student   (12.08.04 12:57)

Извините - бред. Т.е. as всегда вызывает исключительную ситуацию, я правильно понял? (так написано!)
(традиционной и не традиционной бывает секссуальная ориентация)

Ну чем отличается - сказал wicked, е по поводу где применять - по-моему понятно: если есть полная уверенность, что некая переменная в данном месте программы точно указанного типа либо его наследник - то можно применять второе; если такой уверенности нет - первое (важно делать надежные программы).

А вообще - ну в книжках это все есть.
Да и недавно отгремела огромная вполне любопытная ветка по is. Думаю, к as это тоже относится.


QQ   (2004-08-12 13:14:00) [25]

В первом случае вызывается дополнительно процедура @AsClass,
которая проверяет, является ли Senderобъектом класса TPanel или его наследника (если не является - генерируется исключение).
Первый вариант предпочтительнее, если речь не идёт о быстродействии. В любом случае лучше заранее проверить Senderна соответствие: if Sender is TPanel then ...


wicked   (2004-08-12 12:59:00) [26]

1. выполняется проверка на то, является ли Sender экземпляром TPanel или её наследников... и если вдруг Sender окажется экземпляром TButton, наступит исключение...
2. ничего не проверяется, так что если Sender окажется экземпляром TButton, то и компилятор сгенерирует код, ведущий себя с Sender как с TButton...

на самом деле не так всё однозначно, поскольку в коде идёт обращение к свойству, общему и для TPanel, и для, скажем, TButton, поскольку обьявлено оно в общем предке - TWinControl... поэтому в данном случае катастрофы не будет...
но если вдруг в Sender окажется экземпляр, скажем, TList, то второй вариант уже чреват серьезными глюками...

в общем, совет: если нужно обратиться к свойству типа Handle или ClientRect, то кастить такой указатель лучше к классу, в котором это свойство и обьявлено... в данном случае это TWinControl...


_student   (2004-08-12 12:57:00) [27]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо