Operator Is(运行时类型信息)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgOpIs
- 最后更新: 2019-06-26
检查对象是否与从其编译时类型派生的类型兼容
(在继承上下文中)
语法
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 新增
参见
ExtendsExtends ZstringExtends WstringObjectIs (Select Case)Typeof
返回 目录