Hatena::Groupocaml-nagoya

UX-Framework開発日誌

2009-02-06haXeでstructual subtyping

haXeでstructual subtyping

22:42 | haXeでstructual subtyping - UX-Framework開発日誌 を含むブックマーク はてなブックマーク - haXeでstructual subtyping - UX-Framework開発日誌

haXeinterfaceを使ったnominalなsubtypingも可能ですが、無名型を使えばstructualなsubtypingを実現する事ができます。

haXeでのstructual subtypingの例を見てみます。

例えばhaXe

{ name : String }

と書けば、この型は「nameという文字列型のフィールドを持つ何か」を表します(無名型と呼びます)。

この型を使ったshowという関数を下記の用に定義してみましょう。

static function show(x: { name : String }) {
	trace(x.name);
}

nameというフィールドを持つものならどんなものでもこの関数を適用することができます。

例えば下記のようなname, ageという二つのフィールドを持つPersonクラスが定義してあったとします:

class Person {
	public var name: String;
	public var age: Int;
	
	public function new (name, age) {
		this.name = name;
		this.age = age;
	}
}

このとき

{
	var imai = new Person("Y. Imai", 26);
	show(imai);
}

という式(expression)は引数imaiの構造を見て型が問題ないとコンパイル時に判定されます。


JavaActionScriptなどの多くの静的型言語では、structual subtypingが無いために、このことを実現するためにはinterfaceを用意して、Personクラスの定義にimplementsすることを書き加える必要があります。しかし、ライブラリやフレームワークなど手を加えることができないときは、動的な型もしくはunsafeなcastなどを使わざるを得ない場合があります。その場合、型安全性は失われてしまいます。


structual subtypingでは「nameとageを持つ何か」や「ageは持たないけどnameとdraw():Void->Voidをもつ何か」のような型を簡単に定義できるので柔軟で抽象的な型設計を可能とします。そこにはわざわざInterfaceを用意する必要も、それをimplementしていることを明示する必要もありません。しかも、もし必要なフィールドまたはメソッドを持っていなかったときは、コンパイル時に型エラーとなり、間違っている部分の情報を得ることができます。そして実行時には、無いフィールドの参照エラーが起きないことが保証されるのです。

osiireosiire2009/02/09 13:05このhaXeのstructual subtyping(構造的部分型)は暗黙的(showにpersonクラスを適用する時に型を明示する必要が無い)ですね。(色んな意味で)すごい!

NeoNeo2012/07/11 13:32Keep it coming, wrtries, this is good stuff.

gdktfcgrgdktfcgr2012/07/12 15:018EvZpq , [url=http://joabmtzggnov.com/]joabmtzggnov[/url], [link=http://dfmzumgtadeu.com/]dfmzumgtadeu[/link], http://zyrxkkptsssj.com/

kpinvpkpinvp2012/07/13 02:45Wf9jaR , [url=http://fpfitjoayhkd.com/]fpfitjoayhkd[/url], [link=http://prgurjawgodj.com/]prgurjawgodj[/link], http://fltdfvmvnbza.com/