Оператор Is (Информация типа Run-Time)
 
Проверяет, совместим ли объект с типом, производным от его исполнения типа

Синтаксис

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

  • Новое в FreeBASIC

См. также