目次→
演算子→
論理演算子→
Operator Is (Run-time type information)←オリジナル・サイト
オブジェクトが、それのコンパイル時型から派生した型と互換性があるかどうかをチェックします。
(継承の文脈で)
構文:
result = expression Is typename
パラメータ:
expression
typename
調べる子どもの型。
この型は、expression(オブジェクトのコンパイル時型)の型に、直接または間接的に由来するものでなければなりません。
戻り値:
expression が、実数型 typename のオブジェクトか、あるいは、その基底型の1つが expression 型に由来するならば、負数の1 (-1) を返します。
これが非互換の型のオブジェクトの場合、ゼロ (0) を返します。
記述:
組み込み
Object 型を継承する継承構造体からオブジェクトと型の互換性をチェックするには、
Is 演算子を継承と組み合わせて使用する必要があります。
Is 演算子は、オブジェクトが実行時にその派生型と互換性があるかどうかをチェックする、二項演算子です。
Is は実行時型情報(RTTI)に依存しているので、
Extends を使って、組み込み
Object 型から派生した型でのみ、使えます。
コンパイラは、コンパイル時に解決できるチェックに
Is を使うことを認めません。
Is 演算子は、実際の型(「最下位」)のためにだけでなく、型がまだ
expression(コンパイル時型)の型の下にある限り、そのベース型のためにも、使えます。
実際の型を決定するために、最下位から最上位まで、すべての可能性について、チェックされます。
内蔵の
Object 型の拡張は、
Type の一番上に、余分な隠された仮想関数テーブル(vtable :virtual method table)ポインター項目を加えることを可能にします。
仮想関数テーブルは、
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:"
'' Not a Vehicle object?
If Not (*p Is Vehicle) Then
Print , "unknown object"
Return
End If
'' The cast is safe, because we know it's a Vehicle object
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)
Sleep
QBからの違い:
参照: