メニュー
ブログ更新履歴
コンテンツ更新履歴
リンク
  • rlib-MML WebApp
  • MML (Music Macro Language) をコンパイルし、再生やファイル出力(MP4、標準MIDIファイル)をブラウザ上で行えます。
  • Magome
  • クラウドベースのMIDIシーケンサ
    音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています。
twitter
  
現: 2016-08-24 (水) 18:44:55 takatsuka ソース
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。
 +}}
  

  • 技術系備忘録/TypeScript/メンバ関数ポインタ のバックアップ差分(No. All)

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 6851, today: 1, yesterday: 0