ページへ戻る

 印刷 

技術系備忘録​/TypeScript​/メンバ関数ポインタ :: シンクリッジ

xpwiki:技術系備忘録/TypeScript/メンバ関数ポインタ

TypeScript で、クラスのメンバ関数を、変数に入れる方法と、それをコールする方法です。
いわゆる メンバ関数ポインタ です。

メンバ関数を入れる変数の型は、普通の関数の場合と同じように、

	var func : (arg:number)=>string;

みたいな感じでOK。

コールするときは、

	func.call( クラス実体, 第1引数, 第2引数, ・・・ );

という風にします。

以下、自分への備忘録を兼ねたサンプルコードです。
参考になれば幸いです。

	class CUser
	{
		constructor( private m_name:string, private m_money:number ){
		}
		GetName( n : number ): string{
			return this.m_name;
		}
		GetMoney( n : number ): string{
			return (this.m_money + n).toString();
		}
	};

	const table : { [key: string]: (arg:number)=>string } = {	// "(arg:number)=>string" っていうのが関数の型
			"名前":		CUser.prototype.GetName,				// クラス名.ptorotype.メンバ関数名  ってする。
			"所持金":	CUser.prototype.GetMoney,				// クラス名.ptorotype.メンバ関数名  ってする。
		};

	const users : CUser[] = [ new CUser("一郎", 100 ), new CUser("二郎", 200 ), new CUser("三郎", 300 ) ];
	for( let userNo in users ){
		let s : string = `UserNo:${userNo} `;
		for( let key in table ){
			let t = table[key].call( users[userNo], 99 );	// オブジェクト.call() で第1引数に this となるオブジェクトを指定。第2引数以降に関数の引数を指定。
			s += `${key}は${t}。`;
		}
		console.log(s);
	}

	// 出力結果
	// > UserNo:0 名前は一郎。所持金は199。
	// > UserNo:1 名前は二郎。所持金は299。
	// > UserNo:2 名前は三郎。所持金は399。

Last-modified: 2016-08-24 (水) 18:44:55 (JST) (2801d) by takatsuka