Приведение типов в delphi применительно к объектам
Приветствую. В завершение цикла заметок про объект Sender и операторы as и is хотелось бы затронуть и конструкцию тип(переменная). Далее поговорим про различия с объект as тип.
В посте о Sender: TObject я рассмотрел использование объекта Sender, который передаётся процедуре-обработчику.
Приведение и проверку типа объекта с помощью as и is я также рассмотрел в своё время, а сегодня поговорим о подобной конструкции:
procedure TForm1.Button1Click(Sender: TObject); begin if Sender is TButton then TButton(Sender).Caption:='pressed'; end;
Такое приведение Sender к TButton считается стандартным. Однако многие люди считают это плохим тоном, перешедшим из C. Напомню, в C мы пишем (тип) переменная.
И ещё напомню, в прошлых постах мы рассматривали (Sender as TButton).Caption. Так в чём же разница?
Оператор as
Поговорим сначала про него. Такой способ применим только к объектам, да и к интерфейсам. Разрешено приведение к классу-родителю, проверка происходит в runtime, а в случае неверной подборки типов происходит исключение invalid class typecast. Впрочем, если мы вооружимся проверкой с помощью оператора is, это не будет для нас проблемой.
Стандартное, жёсткое приведение
Здесь в runtime ничего не проверяется, исключений типа «invalid class typecast» не возникает. Всё происходит уже при компилировании.
TEdit(Button1).Text:='pressed';
Это ужасно, но это сработает. Можно сказать, что в этом случае мы твёрдо говорим компилятору, что уверены, что это за тип, не стоит проверять. В то время как в операторе as, как сказано выше, предусмотрена такая проверка. Но мы же всё равно проверяем тип с помощью оператора is, зачем нам лишние действия?
Поэтому я склоняюсь к использованию таких конструкций:
procedure TForm1.Button1Click(Sender: TObject); begin if Sender is TButton then TButton(Button1).Caption:='pressed'; end;
Мы говорим компилятору, что объект типа TButton, мы уверены, так как только что проверили.
Ну и напоследок добавлю, что такое приведение типов работает и с обычными переменными, в отличие от оператора as. Но это уже совсем другая история :)
Теперь по поводу обмена постовыми. C радостью обменяюсь с блогом, так или иначе связанным с программированием, с адекватными интересными постами. Вчера один человек стучал в аську, я не успел ему ответить, а теперь найти номер не могу. В общем, если напишешь пост, связанный с программированием, то с радостью обменяюсь, а так нет желания.
PS Картинка к посту из msdn :)
Спасибо, буду пробовать. Я недавно начал изучать программирование, но с несовместимостью типов столкнулся чуть ли не в самом начале. Пока пишу небольшие программы (даже язык не поворачивается их так назвать =)) до 50-80 строк и пока получается обходиться тем, что подбирать совместимые типы, но думаю, что скоро материал действительно пригодится.
Да, вот почитал и невольно вспомнился политех и Паскаль на первом курсе на Пошуках-2 (украинский аналог 086). Прямо ностальгия проснулась, сразу вспомнился синенький экран с желтыми буковками. Кстати до сих пор эту цветовую раскраску в Дельфе юзаю, в память о тех временах :)
Ну такие вещи, на сколько я полагаю, нужно знать с самого начала. Тем кто это упускает с самого начала или считает что ему это не пригодится то глубоко заблуждается или ошибается, кому как будет угодно.
Заинтересовался о delphi, может быть подскажете какую-нибудь литературу?
Знания ассемблера имеются.
Это вряд ли, сам не по конкретной литературе осваивал)
Библия Delphi Михаила Флемова — наверно лучшая книга для новичка.
Несомненно! -только вот фамилия : Флёнов М.Е.
Картинка то про делфи?)) Или объект и оператор?
Картинка из msdn, там она символизировала то же, что и здесь, только применительно к vb
Делфи — это хорошая платформа для начала. Сперва всегда лучше залезть в болото, зато потом и со всеми остальными системами проще будет.
Все конечно красиво и гладко. Но надо смотреть правде в глаза — delphi умирающий язык, к моему сожалению…
Об этом ещё можно поспорить, но я не люблю холивары :)
Можно и поспорить, но проще посмотреть на чем разрабатываются серьезные программы и станет все понятно :(
QIP, FLStudio — несерьёзные программы?)
http://www.google.ru/search?q=delphi+%F3%EC%E8%F0%E0%E5%F2
Ну не надо так буквально трактовать мои слова про несерьезные программы. Возьмем к примеру Винду или Линукс ;)
Ух ты куда замохнулся! На Делфи никогда не писали ОС…наверно. Она не для этих целей изначально…наверно =)
а я сеня на лабе в уни калькулятор на дельфи написал) первая прога))
Мои поздравления :)
Мне нравится Delphi. C него и начинала изучение программирования. Я как то после пары лет работы с Delphi переметнулась на Action Script =) Как сейчас помню первое ощущение что Action Script абсолютно нелогичный =)
Думал Делфи это язык прошлого :-) Почему то уж очень давно про него не слышал, хотя работаю в ИТ компании :-)
Библия Delphi Михаила Флемова – наверно лучшая книга для новичка.
Кстати слышал о ней достаточно противоречивые отзывы
Странно.. Или у меня с головой не всё в порядке, или одно из двух.
Во-первых, кто сказал что php легче Delphi ? это всё равно что говорить что синий лучше красного! это просто очень разные вещи
Во-вторых, может я отстал от нюансов программирования, но Делфи — это объектно-ориентированный язык, а php заточен под создание страниц в интернете с определённого рода действиями.
Таким образом, спор идёт на тему — что лучше BMW или Audi..
Да конечно Тойота :)
Сравнивать PHP c Delphi вообще неверно изначально. Разные языки, заточенные под конкретные РАЗНЫЕ нужды. Соответственно со своими спецификациями. С таким же успехом можно сравнивать HTML и SQL.. :)
Точнее BMW и Менфрейм:)
Для разных задач разные инструменты. Ножом затылок не почешешь, а пальцом не отрежешь колбасы.
Я начинал с pascal в школе, позже delphi. Сейчас работаю на php и изучаю Java.
На мой взгляд delphi очень хорошо для школы, т.е. для обучения программированию всех, включая тех, кому оно нафиг не нужно:)
Далее нужно смотреть какие задачи, такие инструменты и выбирать. Но, ИМХО, для промышленного программирования delphi не годиться. Лучше использовать Java/C#/C++ взависиомсти от задачи.
Собстевенно к привидению типов. Автор, вроде в Delphi for Win32 2009 добавлены generics, напиши о них плиз.
Да, делфи уже устарел, но все же это первый язык, на котром можно накодить любую програму ( это все-такие подобие ООП).
Ванек, ООП сейчас многие поддерживают. И не только Delphi
И все таки определение делфи интерпретаторов происходит наподобие принципов дизасемблирования!
Ух ты :)
Mic крутой программер. оО. Батек Программирования.
Библия Delphi Михаила Флемова — не думаю, что для новичка самое то. Лучше начинать с простых уроков в интернете, а потом переходить уже к книге.
Как было кем-то точно подмечено, у Embarcadero странный маркетинг. Для каждой версии VisualStudio есть версия Express, сейчас актуальна версия 2010. А аналог для Delphi лишь для версии 2006. И цены заоблачные. В результате молодёжь не приходит. А старики уходят туда, где платят, т.е. на C#. Имеются в виду не любители, а те кто зарабатывает программированием деньги. Но главное не в этом, а в том, что под Си гораздо больше наработано, взять тот же Open Source.
Благодаря энтузиастам Delphi не умрёт. Почитал сегодня про BeOS. Она была в своё время настолько хороша, что из числа пользователей этой ОС, которых насчитывалось всего 1,3% от общего числа пользователей компьютеров, собралась команда, которая создала точный клон операционки на базе Linux. Клон называется Haiku. Вывод: хорошее не умирает. А Delphi это то, что мы любим.
Кстати, грядёт возрождение легендарных наладоников Palm, а ведь Palm тоже почти умер.
спасибо. если было бы таких крупиц понятных по больше. А то я начинающий делфист, а заумную литературу неохота читать :(.
Delphi не умирает, просто php — это стандарт для веба, который всех устраивает и его возможностей вполне достаточно. А конструкции интересные, возьму на себе заметку.
У нас в универе его даже убрали,в школе паскаль,а дельфи прошел мимо пришлось самому изучать,довольно легкий и понятный язык. Но на самом деле , его и не используют ведь.
Может позноватенько к диалогу, но что такого нереально написать на делфи?, или реальнее спорить о скорости компиляторов?
Спасибо большое за статью! Благодаря Вам разобрался с одной проблемой которую не мог решить.
Прямое приведение после проверки через is — это не дурной тон, а нормальная практика. Приведение через as немного тормознее прямого.