Типы псевдонимы(Alias)
 
Дополнительные имена для переменных или типов объектов

Обзор
Декларация
Разрешение перегрузки
Указатели на указатели процедуры
Опережение деклараций типов
Неполные типы

Обзор

Тип псевдонимы - это альтернативные имена для типа. Они могут быть использованы для облегчения массового перехода от одного типа к другому, сохранения типизирования, или сделать возможным круговую зависимость.

Декларация

Псевдонимы типа объявляются с помощью ключевого слова Type так же, как объявляются переменные или объекты с Extern или Dim.

В следующем примере декларируется псевдоним типа Single под названием "float", и далее в декларации процедуры идет декларация этих типов. А так же декларируются и инициализируются две переменные этого типа:

Type float As Single

Declare Function add (a As float, b As float) As float

Dim foo As float = 1.23
Dim bar As float = -4.56
        


Псевдоним типа указателя процедуры объявляется таким же образом, как показано в следующем примере:

Declare Function f (ByRef As String) As Integer

Type func_t As Function (ByRef As String) As Integer

Dim func As func_t = @f
        
Function f (ByRef arg As String) As Integer
    Function = CInt(arg)
End Function


Разрешение перегрузки

Псевдонимы типа являются только псевдонимами. Так если взять перегрузку процедуры, то процедура объявленная с параметром типа «alias_to_T» — то же самое, как процедура объявленная с параметром типа «Т»

Другими словами, это ошибка - дублируется определение - объявление процедуры, где параметры отличаются только псевдонимом типа, как показано в следующем примере:

Type float As Single

Declare Sub f Overload (a As Single)

'' Если раскомментировать, это будет генерировать ошибку дублированного определения
'' Declare Sub f (a As float)


Указатели на указатели процедуры

Указатели на указатели процедуры такие же, как любой другой тип указателя, за исключением того, что они указывают на процедурные указатели. Так как синтаксис объявления процедурных указателей не позволяет напрямую создать указатель на указатель процедуры, используется псевдоним типа.

В следующем примере объявляется указатель на процедуру, возвращающий integer pointer, а затем указатель на процедурный указатель возвращающий integer:

Dim pf As Function() As Integer Ptr

Type pf_t As Function() As Integer
Dim ppf As pf_t Ptr
    


Опережение деклараций типов

Псевдонимы типа с опережающими ссылками: псевдоним может относиться к другому типу, который еще не полностью определен.

Type foo As bar

Type sometype
  f   As foo Ptr
End Type

Type bar
  st  As sometype
  a   As Integer
End Type
    


С помощью псевдонима типа и опережающих ссылок происходят циклические зависимости между типами.

Type list As list_

Type listnode
  parent As list Ptr
  text As String
End Type

Type list_
  first As listnode Ptr
  count As Integer
End Type
    


Неполные типы

Тип считается неполным, когда его идентификатор не содержит информации, необходимой для определения размера. В результате нет возможности: выделить пространство для неполных типов, объявить переменную с типом данных неполного типа, передать неполный тип в качестве параметра или доступа к элементам неполного типа.

Однако указатели для неполных типов могут выделены, в том числе объявленные как элементы в других типах или передаваемые в качестве параметров для процедуры, поскольку известен размер указателя.

Type sometype As sometype_

'' Не допускается, поскольку размер sometype неизвестен
'' TYPE incomplete
''   a AS sometype
'' END TYPE

'' Допускается, поскольку известен размер указателя
Type complete
  a As sometype Ptr
End Type
Dim x As complete

'' Не допускается, поскольку размер sometype до сих пор неизвестен
'' DIM size_sometype AS INTEGER = SIZEOF( sometype )

'' Комплектуем тип
Type sometype_
  value As Integer
End Type

'' Разрешено поскольку типы теперь укомплектованы
Dim size_sometype As Integer = SizeOf( sometype )

Type completed
  a As sometype
End Type

Dim size_completed As Integer = SizeOf( completed )