object@ obj_h;
Этот код объявляет хендл объекта, инициализирует его c NULL, то есть хендл не содержит ссылку на объект.
В выражениях хендлы объектов используются точно так же, как обычные объекты. Но вы должны понимать, что хендл не гарантируется актуальную ссылку на объект, и если вы пытаетесь получить доступ к нулевому хендлу, будет сгенерировано исключение.
Операторы, такие как = , или любой другой оператор, зарегистрированный для работы с объектом, работает с хендлом, и также будет вызовано исключение, если хендл пуст.
object obj; object@ obj_h; obj_h = obj;
Установка хендла, указывающего на объект, выглядит так:
object obj; object@ obj_h; @obj_h = @obj;
Хендл объекта можно сравнить с другим хендлом (того же типа), чтобы проверить, не указывают ли они на один и тот же объект. Также можно сравненить хендл с нулевым хендлом, для которого есть специальное ключевое слово:
object@ obj_a, obj_b;
if( obj_a is obj_b ) {}
if( obj_a !is null ) {}
object@ obj_h;
{
object obj;
@obj_h = @obj;
// Обьект умирает после выхода из блока, но хендл продолжает ссылаться на него
}
// Обьект продолжает жить в obj_h...
obj_h.Method();
// ... пока ссылка не будет удалена или хендл не выйдет из области видимости
@obj_h = null;
interface I {}
class A : I {}
class B : I {}
// Сохраняем ссылку в хендле на интерфейс
I @i1 = A();
I @i2 = B();
void function(I @i)
{
// Функции представленные интерфейсом могут быть вызваны прямо из хендла на интерфейс
// В особых случаях воспользуйтесь приведением типов.
A @a = cast<A>(i);
if( a !is null )
{
// Напрямую управляем потомками A
...
}
else
{
// Обьект не типа A
...
}
}