Каково различие между кастингом использования (Объект как TClass) и TClass (Объект)

Получил проблему где MyObj.classnameis(TMyClass.classname) верно и TMyClass(MyObj) работы, но (MyObj as TMyclass).doSomething бросает ошибку преобразования.

Я действительно не хочу справки с тем спамом, хотя, если бы Вы хотите поместить его в комментарии, это было бы супер. Я просто хотел бы знать что различие между Obj as Class и Class(Obj) .

17
задан Kromster says support Monica 4 June 2015 в 13:28
поделиться

2 ответа

As-cast проверяет реальный тип объекта, чтобы убедиться, что приведение действительно, и вызывает исключение, если это не так. При "жестком приводе" (TMyClass(MyObj) style) проверка не производится, он просто говорит компилятору, что приведение действительно.

Если у вас есть ситуация, когда ClassNameIs возвращает true, но as-cast не работает, это означает, что у вас есть два разных класса в двух разных единицах с одинаковым именем, и as-cast пытается привести к неправильному классу. Это также означает, что жесткая привязка выполняется к неправильному классу, что потенциально может привести к повреждению памяти.

Выполните полный поиск проекта по "TMyclass =", чтобы увидеть, где у вас несколько объявлений, и либо переименуйте один из классов, либо используйте полное определение (obj как MyUnit.TMyClass), чтобы компилятор знал, к какому классу вы пытаетесь привести.

32
ответ дан 30 November 2019 в 11:43
поделиться

Дополнение к сообщению Мэйсона: Вместо поиска по вашему коду вы также можете вызвать метод, подобный этому, в том месте, которое дает ты проблема.

function GetClassInheritance(Obj : TObject) : string;
var ClassRef : TClass;
begin
  Result := '';
  ClassRef := obj.ClassType;
  Result := ClassRef.ClassName;
  ClassRef := ClassRef.ClassParent;
  while assigned(ClassRef) do
  begin
    Result    := ClassRef.ClassName + '.' + Result;
    ClassRef  := ClassRef.ClassParent;
  end;

  Result := '(' + obj.ClassType.UnitName + ')' + Result
end;

Это вернет вам строку в формате (UnitName) TObject.TPersistent.TComponent .... Я не помню, чтобы видел "ClassType.UnitName" в старой версии delphi, поэтому эта часть может не работать с ними, а остальные должны.

5
ответ дан 30 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: