Приведение типов в 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 :)