スポンサーサイト

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

F#によるデザインパターン入門 テンプレートパターン(3)

今回はテンプレートパターンで、各工程の実装にデフォルト実装を与えてみます。
まず前々回やったコードを再掲します。
 
[<AbstractClass>]
type AbstractMakeReport (title :string,contentsLst :list<string>)    =
    //この下3つが工程を分ける部分
    abstract member makeTop : string -> string
    abstract member makeMiddle : list<string> -> string
    abstract member makeBottom : unit -> string
    //次のが工程を統合する部分
    member this.makeUpReport () =
        (this.makeTop title) + (this.makeMiddle contentsLst) + (this.makeEnd ()) //文字の連結
 
三つのメソッドmakeTop,makeMiddle,makeBottomにデフォルト実装を与えると例えば次のようになります。
 
type MakeReportBase (title :string,contentsLst :list<string>)    =
    abstract member makeTop : unit -> string
    default this.makeTop() =  title
    abstract member makeMiddle : unit -> string
    default this.makeMiddle() = List.fold (fun s ele -> s + ele + "\n") "" contentsLst
    abstract member makeBottom : unit -> string
    default this.makeBottom() = ""
    member this.makeUpReport () =
        this.makeTop () + this.makeMiddle () + this.makeBottom () //文字の連結
 
タイトルと内容はデフォルトの実装を使い、ボトム部分だけ表示を変えるクラスを派生させてみます。
 
type PlainReportMaker (title :string,contentsLst :list<string>)    =
    inherit MakeReportBase(title,contentsLst)
    override this.makeBottom() = "以上"
 
使ってみます。
> let testPlain = new PlainReportMaker ("今日の料理",["卵焼き";"鮭";"漬物"]);;
 
val testPlain : PlainReportMaker
 
> printfn "%s" (testPlain.makeUpReport());;
今日の料理卵焼き

漬物
以上
val it : unit = ()
 
(注意)
   abstract member makeTop : unit -> string
   default this.makeTop() =  title
等のdefault部分は
default this.makeTop = (fun () -> title)では、エラーとなります。
 
一般に、派生クラスでオーバーライドできる非抽象メソッドをフックメソッドといいます。
 
次に前回やった形に対してデフォルト実装を与えてみます。
まずはデフォルト実装のないものを再掲します。
 
type ReportMaker(title,contentsLst,in_f_top,in_f_middle,in_f_bottom) =
    let mutable f_top = in_f_top
    let mutable f_middle = in_f_middle
    let mutable f_bottom = in_f_bottom
 
    member this.TopFunc
        with set(f) = f_top <- f
    member this.MiddleFunc
        with set(f) = f_middle <- f
    member this.BottmFunc
        with set(f) = f_bottom <- f
 
    member this.makeUpReport () =
        (f_top title) + (f_middle contentsLst) + (f_bottom ()) //文字の連結
 
デフォルト実装を与えておきます。(コンストラクタの引数をタイトルと内容だけに変更しています。)
 
type ReportMaker(title,contentsLst) =
    let mutable f_top = (fun s -> s + "\n")
    let mutable f_middle = (fun cLst ->List.fold (fun s ele -> s + ele + "\n") "" cLst) 
    let mutable f_bottom = (fun () -> "")
 
    member this.TopFunc
        with set(f) = f_top <- f
    member this.MiddleFunc
        with set(f) = f_middle <- f
    member this.BottmFunc
        with set(f) = f_bottom <- f
 
    member this.makeUpReport () =
        (f_top title) + (f_middle contentsLst) + (f_bottom ()) //文字の連結
 
使ってみます。
> let plainReportMaker =
    new ReportMaker("今日の料理",["卵焼き";"鮭";"漬物"]);;
 
val plainReportMaker : ReportMaker
 
> printfn "%s" (plainReportMaker.makeUpReport());;
今日の料理
卵焼き

漬物
 
val it : unit = ()
 
あとは例えば
plainReportMaker.TopFunc <- (fun s -> "--------- " + s + " -----------\n")
とでもするとタイトル部分の表示方法が変更されます。
 
> plainReportMaker.TopFunc <- (fun s -> "--------- " + s + " -----------\n");;
val it : unit = ()
 
> printfn "%s" (plainReportMaker.makeUpReport());;
--------- 今日の料理 -----------
卵焼き

漬物
 
val it : unit = ()
 
ということでテンプレートパターンおしまいです。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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