スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門初級編 第20回 Delegates と Events(8) DelegateEvent

前回まででEvent<,>型とEvent<>型を紹介してきましたが、最後にDelegateEvent型についてふれたいと思います。
 
まずシグネチャーは次のようになっています。
type DelegateEvent<'Delegate> =
 class
  new DelegateEvent : unit -> DelegateEvent<'Delegate>
  member this.Trigger : obj [] -> unit
  member this.Publish :  IDelegateEvent<'Delegate>
 end
 
Event<,>の場合はデリゲートの形がobj * arg -> unit (objはsender)でしたが、この場合はdelegateの型は、「任意のタプル型->unit」 になります。(タプルの要素数はひとつだけでもかまいません。)
trigerでobj[](obj型のarray)の其々の要素をタプルの要素に対応させたものに対して、登録してあるデリゲートがinvokeされます。
 
またPublishされるオブジェクトの型はIDelegateEvent型でこれは次のようなシグネチャーとなっています。
type IDelegateEvent<'Delegate> =
 interface
  abstract this.AddHandler : 'Delegate -> unit
  abstract this.RemoveHandler : 'Delegate -> unit
 end
 
 
例を挙げてみます。
 
type MyDel = delegate of string*int*int*int->unit
 
type PublisherExamp() =
    let _event1 = 
        new DelegateEvent<MyDel>()
    member this.SomethingHappen() =
        let now = System.DateTime.Now
        let tupple1 = now.ToString() //delegateがinvokeするタプルの第一成分を作成
        let tupple2 = now.Year
        let tupple3 = now.Month
        let tupple4 = now.Day
        //obj[]にしてトリガーを引く
        _event1.Trigger([|box tupple1;  box tupple2;box tupple3;box tupple4|]) 
        
    member this.Event1 = _event1.Publish
 
インスタンスを作成してハンドラーを登録します。
 
let pub = PublisherExamp()
pub.Event1.AddHandler(MyDel(fun s y m d -> printfn "string = %s year = %d month = %d day = %d" s y m d))
 
イベントをfireしてみます。
 
> pub.SomethingHappen();;
string = 2010/04/12 8:24:27 year = 2010 month = 4 day = 12
val it : unit = ()
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。