本記事では、ZOS-API の基本的構造と、ZOS-API に適用されるオブジェクト指向プログラミングの概念について説明しています。 ZOS-API のオブジェクト指向の性質は主に「隠されて」いますが、ZOS-API の語彙と構成をよりよく理解するのに役立ちます。
著者 Sandrine Auriol
Introduction
この記事では、オブジェクト指向プログラミングの重要な概念と、それらが ZOS-API でどのように使用されるかについて説明します。開発者でなくても ZOS-API を使用することは可能ですが、いくつかの基本事項を把握すれば、 ZOS-API を使用する作業がはるかに簡単になります。
オブジェクト指向プログラミングとはなにか?
オブジェクト指向言語は、効率的なプログラミング方法を使用します。データはオブジェクトとクラスを使用して編成されるため、コードをプロジェクト毎に最初から作成するのではなく再利用できます。この概念は、OpticStudio ファイルの定義に簡単に使用できます。
各zmx ファイルはある一つの光学系を表現します。この光学系はシーケンシャル又はノンシーケンシャル モードにおいて、異なる数のオブジェクトや面等が設定されることで、区別されます。
オブジェクト指向プログラムでは、各光学システムは API 「オブジェクト」として記述されます。光学系は波長や面タイプといった、共通の特性値を持っています。
オブジェクト指向プログラミングでは、共通の特性値はマスター リストにグループ化されます。この特性のマスター リストはクラスまたはインターフェイスと呼ばれます。
クラスはさらにネームスペースと呼ばれるライブラリにグループ化されます :
コード構造をまとめると以下の様になります :
Namespace (Library containing Classes and Interfaces)
Class / Interface: group (template with attributes)
Functions (action)
Property (set or get a value)
より詳しくは、以下のリンクを参照してください :
ZOS-API の構造
ZOS-API はネームスペースと呼ばれるインターフェイスの階層です。ZOS-API を使用するということは、これらのインターフェイスのいずれかのメンバーである API 「オブジェクト」を作成することを意味します。インターフェイスはオブジェクトに使用できる属性を決定します。
属性のプロパティまたはファンクションとは :
- プロパティとは、設定されたり保存された値を定義したり、読み込んだりすることです。
- ファンクションとは、オブジェクトが実行可能なコマンドです。
オブジェクトのファンクションやプロパティを呼び出すと、常に何らかの応答が返ってきます。以下の様な応答です :
- 数値 (double, int, … )、 テキスト (string)、ブーリアン(true or false)
int value = Object1.NumberOfFields;
- インターフェイスのメンバーである新しいオブジェクト
IField New_Object = Object1.GetField(1);
- プロパティの値の「取得」や、値の「取得」と「設定」
値の取得のシンタックス はvalue = Object1.Normalization;
値の設定のシンタックス はObject1.Normalization = value;
インターフェイスの階層
サンプル ファイルを開いて、どのようにコードが構成されているか調べてみましょう。
- サンプル ファイル "\Zemax\ZOS-API Sample Code\C#\CSharpStandalone_01_new_file_and_quickfocus.cs" を開いてください。このファイルはテキスト ファイルとして開けます。
このサンプル ファイルは C# ですが、 ZOS-API で使うすべてのプログラミング言語でオブジェクト指向プログラミングのコンセプトは共通して使うことができます。 - シンタックス ヘルプ ファイルを開いてください。
このヘルプ ファイルの中で、メイン インターフェイスは ZOSAPI.IOpticalSystem と呼ばれています。これは ZMX ファイルと等価です。
サンプル ファイルの中では、メイン クラスの IOpticalSystem または ZOSAPI.IOpticalSystem は 56 行目で使われています。コードの中では以下の様に書かれています :
IOpticalSystem TheSystem = TheApplication.PrimarySystem;
この行の意味は、 TheSystem と呼ばれるオブジェクトを定義するということです。このオブジェクトは IOpticalSystem インターフェイスのインスタンスです。つまり、新しい空っぽの光学系の新しい zmx ファイルが作られたということです。
システムの特性の定義については ZOSAPI.IOpticalSystem をクリックしてください。
インターフェイスのファンクションとプロパティ
TheSystem の特性値は IOpticalSystem インターフェイスのファンクションとプロパティとして記述できます。
クラスというコンセプトは便利です。なぜなら、 TheSystem が IOpticalSystem クラスのオブジェクトとして定義される時、 TheSystem は IOpticalSystem のすべての属性にアクセスできるためです。これらの属性は ZMX ファイルの共通特性値を定義します。
IOpticalSystem インターフェイスのプロパティの一つに LDE があります。 LDE プロパティは以下のヘルプ ファイルで見られる通り、レンズ データ エディタの値を取得します :
サンプル ファイルに戻ると、コードの 95 行目には以下の様に書かれています :
ILensDataEditor TheLDE = TheSystem.LDE;
このコードはレンズ データ エディタである、 TheLDE と呼ばれるオブジェクトを作るコードです。この TheLDE を作るためにコードでは TheSystem の LDE プロパティが使われています。このプロパティは ILensDataEditor と呼ばれるインターフェイスを返します。見てきた様に、 ZOS-API はインターフェイスの階層に基づいています。
オブジェクトの製作はインスタンス化と呼ばれます。 TheLDE オブジェクトは ILensDataEditor クラスのインスタンス化です。 ILensDataEditor インターフェイス のファンクションやプロパティは TheLDE オブジェクトにも働くことができます。
ILensDataEditor インターフェイスの属性をヘルプ ファイルの中で見つけるためには, 以下の様に ILensDataEditor をクリックしてください。
継承
ILensDataEditor インターフェイスにはファンクションやプロパティが存在しますが、 IEditor クラスから継承されたプロパティも存在します :
IEditor クラスは親クラスとも呼ばれます。 IEditor という親クラスはすべてのエディタの共通特性値を定義しています。
ILensDataEditor という子供のクラスは Lens Data Editor から具体的数値をファンクションやプロパティに割り当てるように定義します。
IEditor をクリックしてみましょう。継承ダイアグラムが示されています。
全ての親クラスのプロパティやファンクションは子供のクラスからアクセス可能です。
例えば AddRow() はすべてのエディタで共通なプロパティです。親クラスで定義されているため、子供のクラスからでもアクセスできるのです。
用語集
-
ネームスペース (Namespace) とは、インターフェイスとクラスの階層を含むライブラリのことです。以下を参照してください。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/namespaces/index -
クラス (Class ) とは、データとふるまいのセットを一つにまとめたデータ構造のことです。クラスにはプロパティとファンクションが含まれます。クラスが使われる時は、コード上でクラスがどのネームスペース のものであるかを宣言する必要があります。クラスのコードは using Namespace を書くことによってネームスペースをインポートするか、ネームスペースを含む完全修飾語名(例えば Namespace.Class.)として与えることができます。
-
インターフェイス (Interface) とは、クラス テンプレートです。インターフェイスにはクラスができる機能の定義も含まれます。 ZOS-API の中では、「I」の文字が前についているクラス名はインターフェイスのことです。インターフェイスは継承させることができます。インターフェイスは継承について興味深い性質があります。
一つのクラスは一つのクラスに対して継承できます (シングル継承) 。
一つのクラスとインターフェイス は複数のインターフェイス に継承することができます (マルチ継承) 。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/interfaces/index -
オブジェクト (Object) とは、変数でありクラスまたはインターフェイスのメンバーまたはインスタンスです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/objects -
メンバー (Member) とは、クラスのデータやふるまいを表しています。クラスのプロパティやファンクションのこととも言い換えられます。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/members -
列挙型 (Enumeration) とは、列挙リストと呼ばれる名前付きコンテンツのセットからなる特殊なタイプです。 enum キーワードは列挙を宣言するのに使われます。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/enum -
継承 (Inheritance) とは、オブジェクト指向プログラミングの基本的な属性のうちの一つです。これにより親のクラスのふるまいを再利用したり、拡張したり、修正したうえで子供のクラスで 使うことができるようになります。
https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/inheritance
KA-01805
コメント
記事コメントは受け付けていません。