クラスの作成

クラス

Curlでクラスを作成するにはdefine-classを使用します。

{define-class public Person
    || ここにコンストラクタ、メンバ、メソッド等をコーディング
}

クラスのインスタンス化は、以下のようにします。 

let p:Person = {Person}
もしくは
let p:Person = {new Person}

コンストラクタ

コンストラクタは、constructorを利用します。また、デフォルトコンストラクタはdefaultという名前で作成します。

{define-class public Person

    field private _name:String

    {constructor public {default
                                   name:String
                               }
         set self._name = name
    }
}

default以外のコンストラクタも複数作成することができます。

{define-class public Person

    field private _name:String

    {constructor public {default
                                   name:String
                               }
         set self._name = name
    }

    {constructor public {TestConstructor
                                   first-name:String,
                                   last-name:String
                               }
         set self._name = first-name & ” ” & last-name
    }
}

{let p1:Person = {Person “amori”}} || デフォルトコンストラクタ
{let p2:Person = {Person.TestConstructor “akira”, “mori”}} || コンストラクタTestConstructor

フィールド、ゲッター(getter)、セッター(setter)

フィールドは上記の例の中の_name:Stringのように記載します。

また、ゲッター、セッターをCurlでは定義できます。Java等ではgetName、setNameのような名前でメソッドとして定義するのが通常ですが、Curlではゲッター、セッターをsettergetterを利用して、定義することができます。

{define-class public Person

    field private _name:String

    {getter public {name}:String
        {return self._name}
    }

    {setter public {name _name:String}:void
        set self._name = _name
    }

    {constructor public {default
                                   name:String
                               }
         set self._name = name
    }
}

{let p:Person = {Person “amori”}}
{output p.name}  || ゲッター
{set p.name = “hokada”} || セッター

また、getter、setterを簡単に記述するために、以下のサンプルのように、フィールドにアクセサとして記述することができます。

field public-get private-set x:String
field public-get package-set y:int
field public-get z:bool

 

メソッド

メソッドの定義には、methodを利用します。

{define-class public Person

    field private _name:String

    {constructor public {default
                                   name:String
                               }
         set self._name = name
    }

    || 戻り値 : Stringのメソッド
    {method public {toString}:String
        {return {format “I’m %s.”, self._name}}
    }
}

クラスの継承

クラスを継承するには、inheritsを利用します。また、construct-superを利用して、親クラスのコンストラクタをコールすることができます。さらに親クラスのメソッド等をコールするには、superを利用します。

{define-class public Member
    {inherits Person} || 親クラス

    field _id:int

    {getter public {id}:int
          {return self._id}
    }

    {constructor public {default
                                   id:int,

                                   name:String
                               }
         {construct-super name}
    }
}

{let m:Member = {Member 1, “amori”}}
{output m.id}
{output m.name} || 親クラスのゲッター

また、Curlでは多重継承もサポートしております。多重継承をするには、inheritsの中に複数のクラスをカンマ区切りでコーディングします。

{define-class public Child
    {inherits Oya1, Oya2, Oya3} || 親クラス(多重継承)

    || …….
}

抽象クラス(abstract)

CurlではJavaのようなインターフェースはサポートされていません。ただし、抽象クラスを作成することはできます。(もちろんabstractなメソッド)これを利用するには、修飾子にabstractを指定します。

{define-class public abstract AbstractPerson

    {method public abstract {toString}:String } 
}

アクセス属性

Curlのアクセス属性は、public、private、package、protectedを指定できます。それぞれの説明は以下のとおりです。

public 全コードがメソッドを呼び出すことができることを示します
package 同じパッケージ内のコードのみがメソッドを呼び出すことができることを示します(デフォルト)
protected 同じパッケージ内のコードまたはサブクラス内のコードのみがメソッドを呼び出すことができることを示します
private 同じクラス内のコードのみがメソッドを呼び出すことができることを示します

アクセス属性「library」

バージョン7からlibrary属性を付与できるようになりました。これは同じマニフェスト内ではpublicのような動きをし、違うマニフェストからはpublicとしてアクセスできないというものです。これにより、ライブラリなどで内部的にはパッケージ間で利用したいが、外部公開したくない場合にやくにたちます。(これはJava7のmoduleのような機能)

 詳細は、こちらを参照ください。