Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 14:02   #11
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
(Data as TSomeClass)
получим красивый exception
О еще один...
Где тут эксепшн увидели мил человек?
Цитата:
так что лучше везде использовать as.
Не надо глупости предлагать.
=master= вне форума Ответить с цитированием
Старый 07.05.2012, 14:09   #12
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Люди поймите насчет ошибок я и так знаю! Обьясните в чем разница между самими конструкциями
RuVarez вне форума Ответить с цитированием
Старый 07.05.2012, 14:27   #13
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Где тут эксепшн увидели мил человек?

да вот же он:


Код:
{$APPTYPE CONSOLE }

uses
  SysUtils;

type
  myTestClass = class
    procedure foo();
  end;

  myOtherClass = class
    procedure foo();
  end;


{ myTestClass }

// --  --
procedure myTestClass.foo();
begin
end;


{ myOtherClass }

// --  --
procedure myOtherClass.foo();
begin
end;


// -- main --

var
  mc: TObject;
begin
  mc := myTestClass.create();
  try
    //
    try
      (mc as myOtherClass).foo();
    except
      writeln('Я кросивый exception!');
    end;
    //
    // а вот тут мы попадаем в любую точку программы, результат непредсказуем:
    myOtherClass(mc).foo();
    //
  finally
    mc.free();
  end;
end.
> Не надо глупости предлагать.

т.е. надо всегда надеятся на "авось, пронесёт"? это индусский подход

> Обьясните в чем разница между самими конструкциями

as выполняет проверку на то, что инстанс реально наследован от типизируещего класса, а конструкция вида TSomeClass(SomeInstance) ничего не проверяет, а тупо берёт истанс и использует его как инстанс класса TSomeClass.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.05.2012, 14:37   #14
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
да вот же он
Эьто совсем другая история.
Цитата:
это индусский подход
это у вас он индуский
например есть такое:
if ( o is TSomeObject)
тут по вашему надо все равно ( o as TSomeObject) ... индия!!
а я про авось даже и не намекал
=master= вне форума Ответить с цитированием
Старый 07.05.2012, 14:44   #15
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
if ( o is TSomeObject)
"Эьто совсем другая история."
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.05.2012, 15:02   #16
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
(mc as myOtherClass).foo();
тут у вас валится после приведения, а тут
Цитата:
myOtherClass(mc).foo();
во время приведения, "почувствуйте разницу".
=master= вне форума Ответить с цитированием
Старый 07.05.2012, 15:27   #17
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

самое смешное, что myOtherClass(mc).foo(); никуда не валится, а исправно вызывает метод foo(); класса myOtherClass. И если в методе явно или неявно не используются self, то вобще никакой проблемы не будет, и код отработает верно (если foo() не виртуальный, конечно).

На самом деле я сам тоже пишу так:

Код:
  if (someobj is TSomeClass) then
    TSomeClass(someobj).somemethod();
Но кому-то может быть удобней вызвать as и вывалиться по обработчику исключений, не используя is.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 07.05.2012 в 15:38. Причина: забыл, что виртуальный метод вызовется у реального класса истанса, а не у типизирующего
veniside вне форума Ответить с цитированием
Старый 07.05.2012, 15:36   #18
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

veniside спасибо за обьяснение
RuVarez вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
missing data provider or data packet Dexes БД в Delphi 3 06.01.2012 11:58
TObject в ValueListEdit'оре D-mon Общие вопросы Delphi 2 24.06.2011 14:11
Sender(TObject); Claster Помощь студентам 3 22.06.2011 16:53
Sender:TObject Superlotles Помощь студентам 10 03.12.2009 13:54
TObject *Sender sergei64_89 Общие вопросы C/C++ 1 06.06.2008 13:36