2010/08/17

クラスの定義方法

NILScriptには、Javaなどのような「クラスベース」のオブジェクト指向プログラミングを行うための機能が用意されており、プロトタイプベースのオブジェクト指向機能しか用意されていない素のJavaScriptよりも簡単に、クラスのような物を作成できます。
ここでは、NILScriptでのクラスの作成方法を説明します。
NILScriptに同梱の「doc\base_class.txt」にも、細かな機能の解説が用意されているので、併せて参照してください。

クラスを定義するには、下記のように「new Class()」の返り値を変数などに代入します。
var SomeClass=new Class({
 __class__:{
  __call__:function(){
   println("called as a function");
  },
  someClassMethod:function(){
  },
 },
 __new__:function(){
  println("initializing");
 },
 someMethod:function(){
  println("do something");
 },
 someProperty:"defaultValue",
 get somePropertyWithAccessor(){
 },
 set somePropertyWithAccessor(){
 },
});
引数となっているのが、インスタンスのメンバを定義したオブジェクトです。
「__new__()」メソッドは、「new SomeClass()」のようにしてクラスのインスタンスを生成する時に実行されるコンストラクタとなります。
「__class__」には、クラス自体のメンバを定義したオブジェクトを指定します。このメンバは、インスタンスを生成することなく「SomeClass.someClassMethod()」のようにして使用できます。
特殊なクラスメンバである「__call__()」では、クラスが「new」を伴わずに通常の関数として呼ばれた時に実行される処理を指定できます。
その他、関数メンバであるメソッドや、単なる値のプロパティ、getter/setterによるプロパティも定義できます。
「__new__」「__class__」「__call__」などは、不要なら定義しなくても構いません。

別のクラスの機能を継承した派生クラスを作成することも可能です。
継承を行うには、下記のようにnew Class()の第1引数に継承元となるクラスを指定します。
この場合、クラスに追加・上書きするメンバは、第2引数で指定します。
var SubClass=new Class(SomeClass,{
 __class__:{
  someClassMethod:function(){
  },
 },
 someMethod:function(){
 },
});
なお、この継承はJavaScriptのプロトタイプチェーンを利用しているため、「(new SubClass()) instanceof SomeClass」のような式はtrueになります。
派生クラスのインスタンスではなく直接のインスタンスかどうかを調べたい場合は、「someObject.constructor===SomeClass」のようにするとよいでしょう。

更に、継承とは別に他のクラスの機能を一括して組み込む「ミックスイン」という機能も用意されています。
ミックスインを利用するには、第2引数以降にミックスしたいクラスを指定します。
他のクラスを継承させずにミックスのみを行いたい場合は、以下のように第1引数を「{}」にするとよいでしょう。
var SomeMixedClass=new Class({},SomeMixin,{
});
どんなクラスでもミックスできますが、通常はミックスインとして使うことを意図して用意されたクラスをミックスします。
NILScriptには、標準で「EventMixin」や「StreamMixin」など、よく使う機能を定義したミックスイン用クラスが用意されているので、是非活用してください。

0 件のコメント:

コメントを投稿