OpenLaszloのアプリ開発言語LZXはオブジェクト指向プログラミング言語です。オブジェクト指向の技法を使うとコーディングの効率化が図れたり、コンポーネントの改造や自作が可能になります。
クラス作成とインスタンス化
クラスとは、オブジェクト指向言語でよく出てくる言葉で、わかりやすくいうとひな型とかテンプレートの意味です。インスタンスとは、ひな型を実際に利用できる形にしたものをいいます。
まず、オブジェクト指向を使わない場合と使った場合でのサンプルコードを2つ示して解説します。もちろんどちらも同じ動作結果になるものです。
リスト1のサンプルは、全く同じ黄色い四角を3つ並べたもので、オブジェクト指向ではないコーディングです。
リスト1の問題点は、同じ記述を繰り返さないといけないという非効率さと、今後設定を変えるときのメンテナンス性の悪さですね。もちろんサンプル自体は簡単な例にすぎません。これが本格的なアプリだと問題の大きさは膨大になります。これをオブジェクト指向プログラミングで解決することができます。
まず黄色い四角のひな型=クラスを作成します。クラスを作成するためのタグは<class>です。では、リスト1の<view>をクラス化してみましょう。まずタグ名をviewからclassに変更します。次にnameでクラス名を付けます。ここではmyViewと名付けています。クラス名の命名規則としては、既存のクラス名と重複できないなど一般的な制約はありますが、特に厳密な制約はなく割と自由です。これでクラスの作成は完了です。
クラス作成はタグのひな型を定義するだけのもので、それだけではなにも動作しません。動作させるにはクラスをインスタンス化します。インスタンス化するといってもLZXの場合はクラス名でのタグを記述するだけです。ここではmyViewクラスを作成したので、そのインスタンスは<myView>というタグになります。
リスト3では、<myView>タグを3つ記述しています。するとリスト1のサンプルと同じように黄色い四角が3つ表示されます。表示している実体は<myView>です。
実はこれまでに頻繁に出てきた<text>や<button>、<window>などのタグもすべてLZXのクラスとしてOpenLaszlo側であらかじめ定義されていて、プログラムを書くとき(=タグを書くとき)に無意識のうちにそれぞれをインスタンス化していたことになります。
それでは、仕様変更のシミュレーションとしてmyViewクラスを改造してみましょう。<class>の中に<view>を1つ追加し、それを親タグよりも縦横4ピクセル小さくして縦横中央に配置することで、赤い枠線付きの黄色い四角に改造しました。インスタンスとしての<myView>の記述には何も変更がありません。このようにひな型であるクラスを変更するだけで一気にアプリ全体の該当タグの挙動を変更することができます。
自作のタグ<myView>は普通の<view>と同じように扱えますので、個別に属性を設定をすることができます。リスト5は幅、高さ、色の変更や、子タグの追加をしてみた例です。
クラスの継承
クラスを作成するとき、既存のクラスの全設定を引き継いで新しいクラスを作成することになります。これを継承と呼びます。<class>のextends属性で継承元クラスを指定します。extendsのデフォルトは<view>なので、これまでのサンプルで作成したmyViewクラスの継承元クラスは実は<view>でした。つまり、自作myViewクラスは<view>の持つすべての属性・メソッド・イベントハンドラを備えていることになります。
myViewクラスを継承して、枠線付きボックスという性質はそのままで、新しく正方形という性質を持つクラスを作成してみましょう。リスト6では、width値をheight値と同じにする、という設定を付け加えることで正方形になるmySquareクラスを作成してみた例です。
属性の設定
リスト6の正方形クラスにはひとつ問題があります。mySquareタグでheightを設定したときは必ず正方形になりますが、widthを設定すると正方形になりません。これでは失敗ですね。
そこで属性を定義するためのタグ<attribute>を使って改善してみましょう。<attribute>はwidth、heightなどの既存の属性を扱うこともできますが、新たな属性名を指定した場合、属性を新規作成することになります。
リスト7のmySquareクラスでは、sizeという名前の属性を定義し、widthとheightにsize属性値を代入するようにしました。つまり、size属性を1つ設定するだけで縦横の設定を同時にでき、正方形になるということです。mySquareインスタンスでは、四角のサイズをwidth/heightではなくsizeで設定します。
イベントハンドラ
イベントハンドラは継承されます。
リスト8では、myViewクラスにonmouseoverとonmouseoutの2つのイベントハンドラを定義しています。実際の動作としては、マウスカーソルが四角の上を出たり入ったりするときに枠線の色が変わります。
myViewを継承したmySquareクラスではさらにonclickイベントハンドラを追加で定義し、size値を5ピクセルずつ増加させています。実際の動作としては、四角をクリックするたびに少しずつ大きくなります。mySquareでもマウスカーソルの出入りで枠線の色が変わるので、onmouseoverとonmouseoutの定義を継承しているのがわかります。
メソッド
メソッドも継承できます。メソッドを継承したときは内容は上書きになります。
リスト9のサンプルでは、mySquareクラスでsize属性値を5ずつ増やすchangesize()メソッドを定義しています。そのmySquareクラスを継承したmySquare2クラスではchangesize()メソッドを再定義し、今度はsize属性値を5ずつ減らす処理に変更しています。
サンプルの四角をクリックすると、上の四角は大きくなり、下の四角は小さくなります。
標準コンポーネントを継承
これまでのサンプルではextendsのデフォルトである<view>を継承したクラスでした。ここでは<text>、<button>、<window>といったOpenLaszloの標準コンポーネントを継承してカスタマイズした例を紹介します。
<text>を継承
<text>を継承したクラスです。文字列の背景色をつけてみた例です。
<button>を継承
<button>を継承したクラスです。ボタンをおすたびにラベルが変わります。
<window>を継承
<window>を継承したクラスです。デフォルトだとウインドウのタイトルバーにある×ボタンを押すとウインドウがその場で消えますが、このサンプルではclose()メソッドを上書きして、消える代わりに上に移動するように変更してみました。画面からはみ出るので上に消えたように見えます。