4 パッケージ/クラス/メソッド
次は、独自にクラスなどを作成するときに必要になる構文を主に説明します。
4-1 パッケージ宣言
package宣言を行うには、「package」を使用します。
package com.samples; ...
{package com.samples
...
}
4-2 import
importを行うには、「import~from~」を使用します。
import jp.codezine.*; import jp.codezine.Foo;
{import * from jp.codezine;}
{import Foo from jp.codezine;}
4-3 アクセスレベル
Curlのアクセス修飾子は、下記表の対応するJavaの修飾子と同じ意味になります。例えば、protectedなら、サブクラスと同じパッケージのクラスからアクセス可能です。
| Java | Curl |
|---|---|
| public | public |
| protected | protected |
| パッケージプライベート(未指定) | package |
| private | private |
4-4 クラス定義
クラス定義を行うには、「define-class」を使用します。
public class Monkey {
...
}
{define-class public Monkey
...
}
4-5 メソッド定義
メソッド定義を行うには、「method」を使用します。
public class Dog {
public String call() {
return "Bow Wow!";
}
}
{define-class public Dog
{method public {call}:String
{return "Bow Wow!"}
}
}
また次のようなコードでメソッドをコールできます。
{curl 6.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{define-class public Dog
{method public {call}:String
{return "Bow Wow!"}
}
}
{value
let dog:Dog = {Dog}
let result:String = {dog.call}
result
}
引数がある場合は、メソッド名の次に引数を指定し、メソッドをコールするときはメソッド名の後ろに引数を記述します。
{method public {methodName arg0:int,arg1:String}:void
...
}
{obj.methodName 99, "foo"}
Javaと同様に、可変長引数もサポートされています。
また、Curlには、コンパイラがメソッドの呼び出しを実際のメソッドのコードに置換するということを指定する「inline」というメソッドの修飾子などもあります。さらに、戻り値については、void、1個の戻り値以外に複数の戻り値を返すことも可能です。詳細は次のURLを参照にしてください。
4-6 抽象クラス定義
Javaと同様に「abstract」を使用します。
public abstract class Animal {
...
}
{define-class public abstract Animal
...
}
4-7 継承
継承を行うには、「inheritsブロック」の中にSuperクラスを記述します。
public class Monkey extends Animal {
...
}
{define-class public Monkey {inherits Animal}
...
}
Curlではインターフェースを作れない代わりに多重継承が可能となっています。また、Javaと同様にメソッドのオーバーライドも可能です。
{define-class public Foo {inherits Bar,Baz}
...
}
4-8 instanceof
Javaのinstanceofに相当する演算子は、「isa」です。
if(value instanceof Person) {
...
}
{if (value isa Person) then
...
}
4-9 キャスト
Monkey monkey = (Monkey)object;
Monkey monkey = Monkey.class.cast(object);
キャストを行うには、「asa」を使用します。
{let monkey:Monkey = object asa Monkey}

