1: 2016-08-24 (水) 18:35:53 takatsuka[4] [5] | 現: 2016-08-24 (水) 18:44:55 takatsuka[4] [6] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | 準備中 | + | #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。 | ||
+ | }} |
(This host) = https://thinkridge.com