LabVIEWオブジェクト指向プログラミングは、他のオブジェクト指向プログラミング言語と類似していますが、データフローグラフィックプログラミング環境である点と、LabVIEWクラスデータの処理方法やクラスコードのデバッグ方法において異なります。

LabVIEWでは、オブジェクトはリファレンスではなく値によって受け渡しされます。オブジェクトのコピーは、通常のオブジェクト指向プログラミング言語におけるクラスタと配列と同様の規則に従って作成されます。

コンストラクタとデストラクタ

LabVIEWオブジェクト指向プログラミングでは、コンストラクタとデストラクタは明示的です。LabVIEWクラスデータを初期化する場合、ユーザがコンストラクタを呼び出す必要はありません。LabVIEWは、クラスを初期化する必要がある場合に自動的にデフォルトのコンストラクタを呼び出します。クラスの初期化は通常フロントパネルまたはブロックダイアグラムの定数で実行されます。LabVIEWは、クラスの値をユーザがプライベートデータ制御器で設定したデフォルト値に初期化します。LabVIEWクラスの情報が必要なくなると、クラスタと配列の場合と同様にメモリが解放されます。クラスデータに別の値を設定するには、新しい値を設定するメンバーVIを作成する必要があります。たとえば、Vehicleクラスの作成時にギアの数のデフォルト値を3に設定し、Truckクラスが継承するギアの数に別の値を割り当てるには、Vehicleクラスの値を変更するメンバーVIを作成する必要があります。新しい値を設定するには、たとえば入力が無くギアの数に割り当てる値を持つクラスを出力するメンバーVIを作成します。つまり、クラスデータタイプの定数のブロックダイアグラムを作成します。

データを平坦化または非平坦化する

LabVIEWは、データを平坦化されたデータとして保存します。「文字列に平坦化」関数と「文字列から非平坦化」関数は、すべてのクラスデータタイプを処理できます。LabVIEWはデータを自動的に平坦化または非平坦化します。LabVIEWでは、すべてのタイプデスクリプタで平坦化されたデータタイプにデータのタイプが維持される一方、LabVIEWクラスの平坦化されたデータ自体でもクラスバージョン情報とともにこの情報が維持されます。LabVIEWクラスの非平坦化に関する情報はLabVIEWクラスで維持されるため、LabVIEWクラスが移動または削除されたために見つからなくなると、LabVIEWはデータを非平坦化できずエラーメッセージを表示します。この場合、サブVIが見つからない場合と同様、メンバーVIを開くとLabVIEWクラスデータが見つからない制御器が淡色表示 (無効) になっています。無効になっている制御器のLabVIEWクラスをロードすると、データが非平坦化され制御器が正常に戻ります。

メモ また、「XMLに平坦化」関数および「XMLから非平坦化」関数を使用して、クラスデータを処理することもできます。

データを変異させる

LabVIEWクラス制御器は、制御器のデータがメモリにあるクラスよりも新しいバージョンのLabVIEWクラスで書き込まれると、警告を表示します。LabVIEWクラスのバージョンは、プライベートデータ制御器のデータタイプやクラスの継承を変更するたびに番号が増えます。LabVIEWクラスのバージョンは、クラスプロパティダイアログボックスで確認できます。クラスのバージョンは、以下の場合自動的に更新されます。

  • LabVIEWクラスの継承が変更された場合。
  • LabVIEWクラスのプライベートデータ制御器が変更された場合。これらの変更には、制御器の追加、置換、並べ替え、削除、制御器の外観の変更、修正タイプ定義の更新などが含まれます。
  • LabVIEWクラスがLabVIEWの新しいバージョンでロードされた場合。
  • ユーザがクラスプロパティダイアログボックスでLabVIEWクラスのバージョンを増やした場合。この操作は、たとえばクラスの新しいバージョンを示すために行います。

クラスの名前を変更すると、LabVIEWはそれを新しいクラスとして認識し、そのクラスの変異履歴が削除され、バージョン番号が1.0.0.0にリセットされます。クラス名は、以下のいずれかの方法で変更できます。

  • メニューからファイル»別名で保存を選択してクラス名を変更します。
  • クラスを所有するライブラリに移動します。
  • クラスを所有するライブラリから移動します。
  • ディスク内にある.lvclassファイルの名前を変更します。
メモ 一度変更したクラス名を他の変更を一切行わずに元の名前に戻しても、そのクラスは元のクラスとは全く同一にはなりません。これは、名前を元に戻した後のクラスに変異履歴が存在しないためです。たとえば、VehicleクラスをVehicle #1という名前に変更し、またVehicleに戻した場合、このクラスは元のVehicleクラスと同一ではありません。

LabVIEWクラスを利用してアプリケーションを開発するLabVIEWクラスのユーザは、LabVIEWクラスのバージョン番号を追跡記録すると有益な効果を得られます。たとえば、クラスのプライベートデータ制御器で符号なしの32ビット整数を使用するアプリケーションにLabVIEWクラスがあります。LabVIEWクラスの開発者は、プライベートデータ制御器の数値制御器を倍精度浮動小数点数に変換するLabVIEWクラスのバージョンをLabVIEWクラスユーザに送信することができます。LabVIEWではバージョンの変更履歴が記録され、すべてのLabVIEWのデータの平坦化または非平坦化が認識されているため、古いバージョンのLabVIEWクラスは新しいバージョンで置換し、変更なしにプログラムを実行することができます。

メモ LabVIEWクラスの将来のバージョンからクラスを非平坦化しようとする場合、LabVIEWでエラーが返されます。たとえば、バージョン番号が1.0.0.3のデータがあり、メモリに常駐するLabVIEWクラスのバージョンが1.0.0.2の場合、このエラーが発生する場合があります。

LabVIEWは、古いバージョンのLabVIEWクラスを認識すると、データの変異を以下のように処理します。

  • LabVIEWクラス階層からクラスを削除すると、LabVIEWはそのクラスの平坦化されたデータを削除します。たとえば、クラスCはクラスBを継承し、クラスBはクラスAを継承するとします。クラスCがクラスAを直接継承するように変更すると、LabVIEWはそのインスタンスのクラスBの平坦化されたデータを削除します。
  • LabVIEWクラス階層にクラスを追加すると、LabVIEWは追加したクラスのクラスデフォルトデータを追加します。たとえば、クラスCはクラスAを継承するとします。クラスCが、クラスAを継承するクラスBを継承するように変更すると、LabVIEWはクラスBのクラスデフォルトデータを追加します。
  • タブ順序の最後にあるクラスのプライベートデータクラスタに要素を追加すると、LabVIEWは古いデータを非平坦化して、クラスデフォルトデータを追加します。
  • クラスのプライベートデータクラスタから要素を削除し、新しい要素を追加しないと、LabVIEWは古いデータを平坦化して削除した要素に関する情報を削除します。
  • クラスのプライベートデータクラスタのタブ順序を変更すると、LabVIEWは非平坦化されたデータの順序をそれに従って変更します。
  • 一度の編集セッションでクラスのプライベートデータクラスタの追加、削除、置換、並べ替えなどを行うと、古いデータを上記の手順で変異させるプロシージャがLabVIEWによって作成、実行されます。

変異は、複数のバージョンに対して順次適用されます (1.0.0.2から1.0.0.6への変更など)。

メモ 増加したバージョンのLabVIEWクラスは元に戻せません。LabVIEWには、制御器および表示器の現在のデータに対して変更を取り消すために十分な情報がありません。現在の変更を元に戻すには、変更を保存しないでください。クラスを参照するクラスとすべてのVIをロード解除してから、ディスクから再ロードします。

LabVIEWクラスの編集時のデータの変異については、NIのWebサイト (ni.com) にある以下のサポートドキュメントを参照してください。

LabVIEWクラスをキャストする

LabVIEWクラスは、「より一般的なクラスに変換」関数によるアップキャストや、「より特定のクラスに変換」関数によるダウンキャストが可能です。また、継承階層を持つRefnumデータタイプ (VIサーバ制御器Refnumなど) に対してこれらの関数を使用できます。関数の作業は同じです。「より一般的なクラスに変換」関数を使用しても、データは変更されませんが、データが通過するワイヤのタイプは変更されます。ただし、VI実行中には関数による影響はありません。「より一般的なクラスに変換」関数は、厳密なコーディング規約に従ったプログラミングにおいて、そのようなデータ変換に対して強制ドットを除去することを主な目的として使用されます。

「より特定のクラスに変換」関数を使用すると、エラーが発生しない限りデータに変化はありません。実行時のワイヤ上のデータがより厳密なクラスに属さない場合は、関数はエラーを返し、出力データはそのワイヤタイプのデフォルト値となります。「より特定のクラスに変換」関数は、親クラスの値に対してタイプテストを行うことを主な目的として使用します。よくあるテスト方法として、複数の「より特定のクラスに変換」関数の呼び出しに同一の親クラスワイヤを接続してそれぞれをより厳密なクラスに送り、どの「より特定のクラスに変換」関数がエラーを返さないかに応じてコードを実行する場合があります。これは非常に非効率的です。このテスト方法を検討している場合は、親クラスの変更が可能であれば、親クラスにダイナミックメンバーVIを記述し、それを各子クラスが適切な機能性によってオーバーライドすることができます。

実行時に、子クラスオブジェクトを親クラスオブジェクトを受け入れるサブVIに配線したことをLabVIEWが検出すると、LabVIEWは自動的にサブVI出力を子クラスオブジェクトにダウンキャストできます。「より特定のクラスに変換」関数を使用しなくても、自動ダウンキャストが実行できます。しかし、自動ダウンキャストは、LabVIEWがサブVIに配線するクラスオブジェクトが、サブVIが受け入れる入力と互換性があることを保証できる場合にのみ実行できます。たとえば、変数にクラスオブジェクトを保存し、変数データをサブVIに配線する場合、LabVIEWはサブVIに含まれるデータが変数に保存された元のデータと同じクラスに属するかどうか保証できません。「ランタイムクラスの保護」関数を使用して、LabVIEWがサブVIに配線したクラスオブジェクトがサブVIが受け入れるクラスオブジェクトと互換性があることを確認することに役立てます。2つのオブジェクトに互換性がない場合は、関数はエラーを返し、出力データのクラスをサブVIが受け入れる親クラスに設定します。この関数をデータ値リファレンスと使用することもできます。データ値リファレンス要素読み取り/書き込み境界ノードは、ランタイムタイプを維持する必要があります。「ランタイムクラスの保護」関数を使用して、データ値リファレンス要素書き込みノードに配線したクラスオブジェクトが、データ値リファレンス要素読み取り境界ノードに配線したクラスオブジェクトと互換性があることを確認できます。

メモ LabVIEWは自動的に再帰サブVIをダウンキャストできません。自動ダウンキャスティングは、再帰サブVIがダイナミックディスパッチVIのブロックダイアグラム上、またはデータ値リファレンスのIn Place要素ストラクチャ内で呼び出されると、呼び出し側のVIを壊します。再帰サブVIのブロックダイアグラム上でランタイムクラスの保護」関数を使用して、サブVIに配線したクラスオブジェクトがサブVIが受け入れるクラスオブジェクトと互換性があることを確認することができます。クラスオブジェクトに互換性がある場合、再帰サイクル外の呼び出し側VIは壊れません。

LabVIEWクラスをロックおよびロック解除する

LabVIEWクラスをロックして、LabVIEWクラスユーザが、アプリケーションの内部実装を構成するメンバーVIを表示できないようにすることができます。LabVIEWクラスをロックすることで、プライベートメンバーVIへのアクセスを防止し、アプリケーションにエラーが引き起こされないようにすることができます。プロジェクトライブラリと同様に、LabVIEWクラスにパスワード保護を追加してもメンバーVIにパスワード保護は追加されません。メンバーVIは個々にパスワード保護する必要があります。

LabVIEWクラスをロックした場合、クラスワイヤ上にカーソルを置いたとき、データタイプだけが詳細ヘルプウィンドウに表示されます。ロックされていないLabVIEWクラスの上にカーソルを移動した場合は、詳細ヘルプウィンドウにクラスのプライベートデータとロックされていない親クラスすべてのクラスプライベートデータが表示されます。一般プローブに表示される情報も、同様の規則に従います。LabVIEWクラスで一般プローブを使用する詳細についてはLabVIEWクラスでプローブを使用するを参照してください。

メモ LabVIEWクラスワイヤとLabVIEWクラス制御器の詳細ヘルプウィンドウには、異なる情報が表示されます。LabVIEWクラス制御器の詳細ヘルプにはエンドユーザに対する説明が表示されますが、LabVIEWクラスワイヤの詳細ヘルプにはLabVIEWクラスユーザに対するデータタイプの詳細情報が表示されます。

LabVIEWクラスユーザにはクラス開発者が示すクラス情報しか表示されないため、このクラス情報には適切な情報を記述する必要があります。クラスの説明の追加クラスプロパティダイアログボックスで、メンバーVIの説明の追加VIプロパティダイアログボックスで行います。

LabVIEWクラスでプローブを使用する

LabVIEWクラスは、一般プローブとカスタムプローブを使用してデバッグすることができます。

LabVIEWクラスワイヤ上で一般プローブを使用できます。LabVIEWクラスワイヤ上の一般プローブに、実行時にクラスの名前、プライベートクラスデータ、およびすべての親クラスのプライベートクラスデータが表示されます。ロックされたLabVIEWクラス上で一般プローブを使用した場合、実行時にクラスの名前のみ、またクラス階層内のロック解除されたプライベートデータのすべてがプローブで表示されます。次の図では、左のVehicleクラスはロックされているためギアの数ドアの数メーカーモデルのプライベートデータは表示されません。Truckクラスはロックされていないため、プライベートデータが表示されます。Truckクラスの一般プローブには継承されたVehicleクラスのプライベートデータが表示されないことに注目してください。これは、Vehicleクラスがロックされているためです。

LabVIEWクラスにカスタムデフォルトプローブを作成すると役に立ちます。カスタムプローブは、ワイヤタイプと同一のクラスタイプかワイヤタイプの先祖であるLabVIEWクラスワイヤでのみ使用できます。LabVIEWクラス開発者は、クラスのメンバーでありクラスのプライベートデータを直接表示するカスタムプローブを作成できます。LabVIEWクラスユーザは、クラスのパブリックメソッドを使用して取得できる情報を表示するカスタムデフォルトプローブを作成できます。

クラス開発者は、LabVIEWクラスユーザのために特定のカスタムプローブをデフォルトプローブとして設定できます。ロックされたLabVIEWクラスの一般プローブのデータはプライベートであるため、LabVIEWクラスユーザに対してはこれらのデータ値に関する情報が表示されません。LabVIEWクラス開発者は、LabVIEWクラスにカスタムプローブを作成してデフォルトとして設定することで、クラスをロックした後に適切なデータを表示するデフォルトプローブをクラスユーザに対して提供することができます。デフォルトプローブとして設定するカスタムプローブは、LabVIEWクラスのメンバーでなければなりません。

LabVIEWクラスを他の開発者やユーザに配布する

作成したLabVIEWクラスを別のLabVIEWクラスの開発者やユーザに配布することができます。クラスはいくつかの方法で配布できますが、状況に最も適した方法を選択する必要があります。アプリケーションビルダを使用して、クラスを配布するためにZipファイルを作成することができます。また、配布する前にLabVIEWクラスをロックしてクラスユーザによるプライベートデータやメンバーVIへのアクセスを制限することもできます。クラスをロックするとアプリケーションでのエラー発生を防止することができます。

ヒント LabVIEWクラスには.NET Frameworkアセンブリによってアクセスすることもできます。LabVIEWでは、指定したLabVIEWクラスの.NETクラスを生成でき、これらの.NETクラスには.NETアセンブリによってアクセスできます。