ページへ戻る

− Links

 印刷 

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

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

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

メンバ関数を入れる変数の型は、普通の関数の場合と同じように、
#prettify{{
	var func : (arg:number)=>string;
}}
みたいな感じでOK。

コールするときは、
#prettify{{
	func.call( クラス実体, 第1引数, 第2引数, ・・・ );
}}
という風にします。

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

#prettify{{
	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。
}}

« Prev[3]