最近妄想している言語仕様があるので実装する力もなく書きますよ
構文はjava風だけどjava風がいいと思っているわけでは特にない。現状のjava-vmでも動くような何かを作ってくれる人がいるんじゃないかなぁ、とは思っている。基本はjava。javaの嫌なところは、クラスの定義が大変、ということ。それを何とかできるような色々。
クラスをラップするクラスが作れる
class Fuga{ int fugaval; Fuga(){ this.fugaval=1; } Fuga( int v ){ this.fugaval=v; } Fuga( int v, int v2 ){ this.fugaval=v+v2; } public int fuga(){ return this.fugaval; } } class Hoge wraps Fuga{ int hogeval; Hoge(int v){ // 既にこの時点で this.fugaval は初期化されている。 this.hogeval =v; } public int hoge(){ return this.fuga()+this.hogeval; } } Fuga f = new Fuga(1); Hoge h = new Hoge(2) wrap f; h.fuga();
クラスの継承と違うのは、コンストラクタの書き方。Fuga クラスのコンストラクタとHoge クラスのコンストラクタを全く分けて定義するので、Fuga のコンストラクタが100パターンあってもHogeクラスのコンストラクタは1パターンですむ。
またFugaとHogeの初期化を別のタイミングで行えることによるメリットもあると思う。
内部的な動作としては委譲と同じでいけると思う。
後からメソッドがつけられる
たとえば
class Hoge{ public int huga(){ return 0; } }
というのがあったとして、
int Hoge::bar(){ return this.huga() + 1; }
とか加えることができる。
後付けするメソッドからはpublicなメソッドのみ呼び出すことができる。
ただしこれは実行時ではなくてコンパイル時に決定していないといけない。(if分で振り分けて同じオブジェクトに違うメソッドを実装、などはできない)
プロパティーは「いつ初期化するんだよ問題」があるので追加できない。プロパティーも追加したい場合はラップを使う。
インターフェースが後付けできる
メソッドが後付けできるので、インターフェースが後付けできる。
class Fuga{ Fuga(){ this.fugaval=1; } public int fuga(){ //なんか } } interface Fugable{ public int fuga(); } //クラス宣言をいじらずにインターフェース実装済み宣言 Fuga implements Fugabule; interface Hogeable{ public int hoge(); } int Fuga::hoge(){ //なんか } //メソッドを後付けしてインターフェース実装済み宣言 Fuga implements Hogeable;
こんなかんじ。これで変なラッパークラスを作らなくてすむ。