FreeBASIC マニュアルのトップに戻る

FreeBASIC OpIs

目次演算子論理演算子Operator Is (Run-time type information)←オリジナル・サイト

演算子 Is (実行時型情報) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


オブジェクトが、それのコンパイル時型から派生した型と互換性があるかどうかをチェックします。
(継承の文脈で)

構文:
result = expression Is typename

パラメータ:
expression
チェックするべき式。Extends を使って Object から直接的または間接的に派生した型のオブジェクト。
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からの違い:

参照:
比較演算子 に戻る
演算子 に戻る
型とクラスの演算子 に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-06-26 12:52:45
日本語翻訳:WATANABE Makoto、原文著作者:DkLwikki

ホームページのトップに戻る

表示-非営利-継承