Дополнительные имена для переменных или типов объектов
Обзор
Декларация
Разрешение перегрузки
Указатели на указатели процедуры
Опережение деклараций типов
Неполные типы
Обзор
Тип псевдонимы - это альтернативные имена для типа. Они могут быть
использованы для облегчения массового перехода от одного типа к другому,
сохранения типизирования, или сделать возможным круговую зависимость.
Декларация
Псевдонимы типа объявляются с помощью ключевого слова
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 )