3.8 Псевдоним типа

На верх  Назад  Вперёд

Псевдоним типа это способ дать типу другое имя, но может быть использован и для создания новых типов. Какой из способов использовать, зависит от ваших потребностей


Псевдоним типа

314


В первом случае мы лишь даём типу другое имя:

Type

MyInteger = Integer;

Мы создаём новое имя для типа Integer, но не создаём новый тип. То есть, две переменные:

Var

A : MyInteger;

B : Integer;

Будут (фактически, с точки зрения компилятора) иметь одинаковый тип (Integer).

Описанным выше способом можно создать типы зависящие от платформы, используя псевдонимы типов можно определить типы для каждой платформы отдельно. Программист, который использует эти пользовательские типы не будет думать о размере исходного типа: он вообще может не знать на чём этот тип основан. Он также может использовать имена псевдонимов для полных имен типов. Например можно определить system.longint как Olongint, а затем переопределить как longint.

Псевдоним часто нужен для повторного введения типа:

Unit A;

 

Interface

 

Uses B;

 

Type
MyType = B.MyType;

Эта конструкция часто видна при рефакторинге, при переобъявлении в модуле B типов из модуля A, для сохранения обратной совместимости интерфейса модуля A.

Другой случай более хитрый:

Type

MyInteger = Type Integer;

Он не только создает новое имя для обозначения типа Integer, но фактически создает новый тип. То есть, две переменные:

Var

A : MyInteger;

B : Integer;

Не будут иметь одинаковый тип (с точки зрения компилятора). Тем не менее, эти два типа совместимы по присваиванию. А значит присваивание

  A:=B;

будет действовать.

Разница видна при рассмотрении информации о типе:

If TypeInfo(MyInteger)<>TypeInfo(Integer) then

Writeln('MyInteger и Integer различные типы');

Функция компилятора TypeInfo возвращает указатель на двоичную информацию о типе. Так как два типа MyInteger и Integer различны, будут генерироваться различные информационные блоки для этих типов, и указатели будут отличаться.

Разница типов имеет три последствия:

1.Так как они имеют разные TypeInfo, значит отличается и RTTI (Run-Time Type Information).

2.Можно их использовать при прегрузке функций, то есть

Procedure MyProc(A : MyInteger); overload;

Procedure MyProc(A : Integer); overload;

будет работать. Но это не будет работать если просто определить псевдоним типа (как в первом случае).

3.Их можно использовать и при перегрузке операторов, то есть
Operator +(A,B : MyInteger) : MyInteger;
тоже будет работать.