Приведение типов в delphi применительно к объектам

Приведение типов в 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. Но это уже совсем другая история :)

crystalbit

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

PS Картинка к посту из msdn :)

40 ответов к «Приведение типов в delphi применительно к объектам»

  1. Спасибо, буду пробовать. Я недавно начал изучать программирование, но с несовместимостью типов столкнулся чуть ли не в самом начале. Пока пишу небольшие программы (даже язык не поворачивается их так назвать =)) до 50-80 строк и пока получается обходиться тем, что подбирать совместимые типы, но думаю, что скоро материал действительно пригодится.

    1. Да, вот почитал и невольно вспомнился политех и Паскаль на первом курсе на Пошуках-2 (украинский аналог 086). Прямо ностальгия проснулась, сразу вспомнился синенький экран с желтыми буковками. Кстати до сих пор эту цветовую раскраску в Дельфе юзаю, в память о тех временах :)

  2. Ну такие вещи, на сколько я полагаю, нужно знать с самого начала. Тем кто это упускает с самого начала или считает что ему это не пригодится то глубоко заблуждается или ошибается, кому как будет угодно.

  3. Делфи — это хорошая платформа для начала. Сперва всегда лучше залезть в болото, зато потом и со всеми остальными системами проще будет.

            1. Ух ты куда замохнулся! На Делфи никогда не писали ОС…наверно. Она не для этих целей изначально…наверно =)

  4. Мне нравится Delphi. C него и начинала изучение программирования. Я как то после пары лет работы с Delphi переметнулась на Action Script =) Как сейчас помню первое ощущение что Action Script абсолютно нелогичный =)

  5. Странно.. Или у меня с головой не всё в порядке, или одно из двух.
    Во-первых, кто сказал что php легче Delphi ? это всё равно что говорить что синий лучше красного! это просто очень разные вещи
    Во-вторых, может я отстал от нюансов программирования, но Делфи — это объектно-ориентированный язык, а php заточен под создание страниц в интернете с определённого рода действиями.

    Таким образом, спор идёт на тему — что лучше BMW или Audi..
    Да конечно Тойота :)

    1. Сравнивать PHP c Delphi вообще неверно изначально. Разные языки, заточенные под конкретные РАЗНЫЕ нужды. Соответственно со своими спецификациями. С таким же успехом можно сравнивать HTML и SQL.. :)

    2. Точнее BMW и Менфрейм:)
      Для разных задач разные инструменты. Ножом затылок не почешешь, а пальцом не отрежешь колбасы.
      Я начинал с pascal в школе, позже delphi. Сейчас работаю на php и изучаю Java.
      На мой взгляд delphi очень хорошо для школы, т.е. для обучения программированию всех, включая тех, кому оно нафиг не нужно:)
      Далее нужно смотреть какие задачи, такие инструменты и выбирать. Но, ИМХО, для промышленного программирования delphi не годиться. Лучше использовать Java/C#/C++ взависиомсти от задачи.

      Собстевенно к привидению типов. Автор, вроде в Delphi for Win32 2009 добавлены generics, напиши о них плиз.

  6. Библия Delphi Михаила Флемова — не думаю, что для новичка самое то. Лучше начинать с простых уроков в интернете, а потом переходить уже к книге.

  7. Как было кем-то точно подмечено, у Embarcadero странный маркетинг. Для каждой версии VisualStudio есть версия Express, сейчас актуальна версия 2010. А аналог для Delphi лишь для версии 2006. И цены заоблачные. В результате молодёжь не приходит. А старики уходят туда, где платят, т.е. на C#. Имеются в виду не любители, а те кто зарабатывает программированием деньги. Но главное не в этом, а в том, что под Си гораздо больше наработано, взять тот же Open Source.
    Благодаря энтузиастам Delphi не умрёт. Почитал сегодня про BeOS. Она была в своё время настолько хороша, что из числа пользователей этой ОС, которых насчитывалось всего 1,3% от общего числа пользователей компьютеров, собралась команда, которая создала точный клон операционки на базе Linux. Клон называется Haiku. Вывод: хорошее не умирает. А Delphi это то, что мы любим.
    Кстати, грядёт возрождение легендарных наладоников Palm, а ведь Palm тоже почти умер.

  8. спасибо. если было бы таких крупиц понятных по больше. А то я начинающий делфист, а заумную литературу неохота читать :(.

  9. Delphi не умирает, просто php — это стандарт для веба, который всех устраивает и его возможностей вполне достаточно. А конструкции интересные, возьму на себе заметку.

  10. У нас в универе его даже убрали,в школе паскаль,а дельфи прошел мимо пришлось самому изучать,довольно легкий и понятный язык. Но на самом деле , его и не используют ведь.

  11. Может позноватенько к диалогу, но что такого нереально написать на делфи?, или реальнее спорить о скорости компиляторов?

  12. Спасибо большое за статью! Благодаря Вам разобрался с одной проблемой которую не мог решить.

  13. Прямое приведение после проверки через is — это не дурной тон, а нормальная практика. Приведение через as немного тормознее прямого.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *