Идентификация (информационные системы)
- 1 year ago
- 0
- 0
Динамическая идентификация типа данных ( англ. r un- t ime t ype i nformation, r un- t ime t ype i dentification, RTTI ) — механизм в некоторых языках программирования , который позволяет определить тип данных переменной или объекта во время выполнения программы.
Существует множество реализаций такого механизма, но наиболее распространёнными являются:
Таким образом, операция определения типа сводится либо к поиску в таблице, либо к просмотру нескольких байт до адреса, на который указывает указатель на объект. У каждого способа есть свои преимущества и недостатки. К примеру, в первом случае для определения типа переменной, требуются некоторые операции поиска по таблице указателей. А во втором случае, переменные начинают занимать больше места в оперативной памяти, чем ожидается, ведь к их известному размеру добавляется некоторое количество байтов, нужных для идентификации их типа.
В
C++
для динамической идентификации типов
применяются операторы
dynamic_cast
и
typeid
(определён в файле
typeinfo.h
), для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.
Оператор
dynamic_cast
пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или
void*
.
void*
, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.
Оператор
typeid
возвращает ссылку на структуру
type_info
, которая содержит поля, позволяющие получить информацию о типе.
Компилятор
Delphi
сохраняет в исполняемом файле программы информацию обо всех классах, используемых в ней. При создании любого объекта в памяти перед ним (по отрицательным
смещениям
) располагается заголовок, в котором есть в том числе ссылка на структуру-описатель класса этого объекта. Встроенные в язык функции работают с этой информацией прозрачно для программиста. Оператор
is
позволяет проверить, является ли объект или тип наследником определённого типа, а оператор
as
используется для приведения объектов или интерфейсов от одного типа к другому, являясь аналогом
dynamic_cast
в
C++
.
Заголовки объектов — также неявно — используются для автоматического управления памятью .
В
C#
для определения типа объекта во время исполнения используется метод
GetType
, а также ключевые слова
is
и
as
, которые являются аналогами для
typeid
и
dynamic_cast
в
C++
соответственно.
В
Java
тип объекта может быть получен при помощи метода
getClass()
, объявленного в классе
java.lang.Object
и потому реализуемого каждым классом. Для проверки принадлежности объекта определённому типу используется оператор
instanceof
, аналогом
dynamic_cast
из
C++
является оператор приведения типа, который в случае несоответствия типов выбрасывает исключение
ClassCastException
.
На уровне байт-кода вызов метода класса записывается, как и вызов всякого другого метода, при помощи опкода invokevirtual . Для проверки приводимости объекта к типу используются опкоды instanceof и checkcast .
В Perl тип объекта может быть определён с помощью функции blessed(), являющейся частью CPAN-модуля Scalar::Util. Функция принимает указатель на объект (blessed hash или аналог) и возвращает скаляр, содержащий имя класса.
В стандартной библиотеке
PHP
определена функция
gettype()
, которая возвращает строку с именем встроенного типа или строку
object
, если тип переданного функции аргумента - определённый пользователем класс.