スポンサーサイト

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

F#入門第41回(OOP(6)genericなクラス)

今日のお題は「OOP(6)genericなクラス」です。
 
genericなクラスを定義する前に、まず例としてint型の数を保存するスタッククラスを定義してみます。
(スタックとは、最後に登録したデータが先に出てくるという特徴をもつ、データの容器です。本を机の上に積み上げるような構造になっており、データを入れるときは新しいデータが一番上に追加され、データを出すときは一番上にある新しいデータが優先して出てきます。)
(注意)以下でlistをmutableな識別子で束縛して取り扱っていますが、本来listはimmutableな識別子で束縛して取り扱うように設計されていて、このような使用方法は邪道で、本来は、すべきでない使用方法かと思われます。
 
type MyIntStack () =
    let mutable lst :int list = []
    
    //データの登録
    member this.Push (k:int) =
                lst <- k ::lst
    
    //データの取り出し
    member this.Pop () =
              match lst with
              | hd ::tl -> lst <- tl
                           Some(hd)
              | []      -> None
 実行例
 > let t = new MyIntStack ();;
val t : MyIntStack
 
> t.Push (3);;
 
val it : unit = ()
 
> t.Push (4);;
val it : unit = ()
 
> t.Pop();;
val it : int option = Some 4
 
> t.Pop();;
val it : int option = Some 3
 
> t.Pop();;
val it : int option = None
 
次にfloat型の数を保存するスタッククラスを定義してみます。
 
type MyFloatStack () =
    let mutable lst :float list = []
    member this.Push (k:float) =
                lst <- k ::lst
    member this.Pop () =
              match lst with
              | hd ::tl -> lst <- tl
                           Some(hd)
              | []      -> None
 
これは見ての通り、int型の場合とほとんど同じで、処理する値の型だけが異なっています。
別々に定義するのは手間です。
実は次のように、型もパラメーター扱いしてクラスを定義すれば、一つのクラスでさまざまな型に対して対応できます。
例えば次のようになります。
 
type MyStack<'a> () =
    let mutable lst :'a list = []
    member this.Push (k:'a) =
                lst <- k ::lst
    member this.Pop () =
              match lst with
              | hd ::tl -> lst <- tl
                           Some(hd)
              | []      -> None
 
MyIntStack,MyFloatStackとの違いは次の2点です。
クラス名のあとに<>が続き、そこに何らかの型を表す'aが入ってます。
クラスの定義部分で型int,float等が書かれていた部分が'aに変わっています。
こうしておいて、
> let t = MyStack<int> ();;
とすればint型のスタックが
> let t = MyStack<float> ();;
とすればfloat型のスタックが生成されます。
このようなクラスをgenericなクラスといいます。
 
この型もパラメーター扱いするという考え方は、この後のインターフェイスのところでも、出てきますので覚えておいてください。
 
さて宿題です。
キューとは、先に入力したデータが先に出力されるという特徴をもつ、データの容器です。。ちょうど遊園地の乗り物待ちのような構造になっており、データを入れるときは新しいデータが最後尾につき、データを出すときは一番古いデータが優先して出てくるという特徴をもちます。
上のMyIntStackクラスに手を加えて、MyIntQueueクラスを定義してください。
データの追加はEnqueue(k:int)、取り出しはDequeue()で行うものとします。
練習なので、効率は悪いですがList.appendか@演算子を使用してください。

スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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