检查对象是否与从其编译时类型派生的类型兼容
语法
result = expression Is typename
参数
expression
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差别
参考