Skip to content

Operator Is(运行时类型信息)


检查对象是否与从其编译时类型派生的类型兼容

(在继承上下文中)

语法

result = expression Is typename

参数

expression

要检查的表达式,是一个使用 Extends 直接或间接从 Object 派生的类型的对象。

typename

要检查的子类型。此类型必须直接或间接从 expression 的类型(对象的编译时类型)派生。

返回值

如果表达式是真实类型为 typename 或其从 expression 类型派生的基类型之一的对象,返回负一(-1);如果是不兼容类型的对象,返回零(0)。

描述

Is 运算符必须与继承一起使用,以检查继承结构中扩展内置 Object 类型的对象与类型之间的兼容性。

Is 运算符是一个二元运算符,在运行时检查对象是否与其派生类型兼容。由于 Is 依赖于运行时类型信息(RTTI),它只能用于使用 Extends 从内置 Object 类型派生的类型。编译器不允许将 Is 用于可以在编译时解决的检查。

Is 运算符不仅对真实类型("最低"类型)成功,也对其基类型成功,只要它们仍低于 expression 的类型(编译时类型)。为了确定真实类型,必须从最低到最高检查所有可能性。

扩展内置 Object 类型允许在 Type 顶部添加额外的隐藏 vtable 指针字段。vtable 用于访问 Is 运算符使用的运行时类型标识信息。

此运算符不能被重载。

示例

start GeSHi

vb
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)

end GeSHi

与 QB 的区别

  • FreeBASIC 新增

参见

  • Extends
  • Extends Zstring
  • Extends Wstring
  • Object
  • Is (Select Case)
  • Typeof

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系