操作符 Is (Run-Time Type Information)
 
检查对象是否与从其编译时类型派生的类型兼容

语法

result = expression Is typename

参数

expression
要检查的表达式,直接或间接派生自Object的类型的对象。
typename
要检查的孩子类型。此类型必须直接或间接地从expression 类型(对象的编译时类型)导出。

返回值

如果表达式是实型typename 的对象或从expression 类型派生的基类型之一或零(0),则返回否定(-1),如果它是不兼容的对象类型。

说明

Is运算符是一个二进制运算符,用于在运行时检查对象是否与其派生类型兼容。因为Is依赖于运行时类型信息,它只能与内置Object类型派生的类型一起使用。编译器不允许使用Is在编译时可以解决的检查。

只要它们仍然低于expression 类型(编译时类型),Is运算符不仅可以用于实际类型(“最低”),还可以成为其基本类型。为了确定实际类型,必须检查从最低到最高的所有可能性。

扩展内置Object类型允许在Type的顶部添加一个额外的隐藏的vtable指针字段。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 "识别:"

    ''不是车对象?
    If Not (*p Is Vehicle) Then
        Print , "未知物体"
        Return
    End If

    '' The cast is safe, because we know it'是车辆对象
    Print , "名称:" & CPtr(Vehicle Ptr, p)->Name

    If *p Is Car Then
        Print , "这是一辆车"
    End If

    If *p Is Cabriolet Then
        Print , "这是一个敞篷车"
    End If

    If *p Is Bike Then
        Print , "这是一辆自行车"
    End If
End Sub

Dim As Car ford
ford.name = "涉"
identify(@ford)

Dim As Cabriolet porsche
porsche.name = "保时捷"
identify(@porsche)

Dim As Bike mountainbike
mountainbike.name = "山地自行车"
identify(@mountainbike)

Dim As Vehicle v
v.name = "一些未知的车辆"
identify(@v)

Dim As Object o
identify(@o)


与QB差别

  • 新的FreeBASIC

参考