Проверяет, совместим ли объект с типом, производным от его исполнения типа
Синтаксис
result = expression Is typename
Параметры
expression
Выражение для проверки, объект типа, который прямо или
косвенно, получен от
Object.
typename
Дочерний тип для проверки. Этот тип должен быть прямо или
косвенно происходить от типа выражения (Объект RinTime
типа).
Возвращаемое значение
Возвращает минус единицу (-1), если выражение является объектом реальном
типа typename или одним из его базовых-типов, производных от
типа expression, или нулевое значение (0) если это объект
несовместимого типа.
Описание
Оператор
Is является бинарным оператором, который проверяет,
является ли объект совместимым с его производным типом во время выполнения.
Поскольку
Is опирается на информацию
RinTime типа, его можно использовать только с типами, которые
являются производными от встроенного типа
Object.
Компилятор запрещает использование
Is для проверок, которые
могут быть решены во время компиляции.
Оператор
Is успешен не только для реального типа ("низко"),
но также и для его базовых-типов, пока они все еще ниже типов
expression ( runtime-тип).
Для того чтобы определить реальность типа, все возможности от низшего к
высшему должны быть проверены.
Расширение встроенного типа
Object
позволяет добавить дополнительное поле для скрытого указателя vtable в
верхней части
Type. vtable
используется для доступа к информации для идентификации типа во время
выполнения, используя оператор
Is.
Пример
Type Vehicle extends object
As String Name
End Type
Type Car extends Vehicle
End Type
Type Cabriolet extends Car
End Type
Type Bike extends Vehicle
End Type
Sub identify(ByVal p As object Ptr)
Print "Identifying:"
'' Не объект Vehicle?
If Not (*p Is Vehicle) Then
Print , "unknown object"
Return
End If
'' Приведение типа является
безопасным, потому что мы знаем, что это объект Vehicle
Print , "name: " & CPtr(Vehicle Ptr, p)->Name
If *p Is Car Then
Print , "It's a car"
End If
If *p Is Cabriolet Then
Print , "It's a cabriolet"
End If
If *p Is Bike Then
Print , "It's a bike"
End If
End Sub
Dim As Car ford
ford.name = "Ford"
identify(@ford)
Dim As Cabriolet porsche
porsche.name = "Porsche"
identify(@porsche)
Dim As Bike mountainbike
mountainbike.name = "Mountain Bike"
identify(@mountainbike)
Dim As Vehicle v
v.name = "some unknown vehicle"
identify(@v)
Dim As Object o
identify(@o)
Отличия от QB
См. также