Оглавление

Хендл объекта

Хендл - это тип, который может содержать ссылку на объект. Используя хендлы можно заявить более одной ссылки на объект. Не все типы объектов позволяют использовать хендлы. Например не могут иметь хендлы примитивные типы данных (логический, целый, дробный, и т.д.). Возможность использования хендла зарегистрированными типами зависит от параметров регистрации.

Использование

Хендл объявляется добавлением символа @ к типу.
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
    ...
  }
}

Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.