Hatena::Groupocaml-nagoya

UX-Framework開発日誌

2009-02-09classの継承と匿名型のextensionは違う

classの継承と匿名型のextensionは違う

19:42 |  classの継承と匿名型のextensionは違う - UX-Framework開発日誌 を含むブックマーク はてなブックマーク -  classの継承と匿名型のextensionは違う - UX-Framework開発日誌

haXeではクラス A を 継承して x: Int というフィールドを与えた次のようなクラス B1:

class B1 extends A {
	public var x : Int;
}

と x: Intを A に加えた拡張型B2:

typedef B2 = { > A, x : Int }

は 異なります。

つまり以下の用に、B1型のインスタンスをxフィールドを持った匿名型として扱おうとするとコンパイルエラーになってしまうのです。

class Test {
 	var b1 : B1;	
	function method () {
		var b2 : {> A, x: Int} = b1;  // <- ここが型エラー
	}
}

エラーメッセージ

Test.hx:13: characters 2-29 : B1 should be +A

haXeでsturactual subtypingを実現するためには匿名型は必須なので、そのためにはclassの継承を使えないようです。

A用の匿名型ATを作って、ATのextension ({> AT, x: Int}) を使えば問題ありませんでした。失礼しました。匿名型の拡張には匿名型を使いましょう。

YelhsaYelhsa 2013/02/17 20:55 That's a smart way of thkiinng about it.

ゲスト



トラックバック - http://ocaml-nagoya.g.hatena.ne.jp/uxtk/20090209