カウンター クラス - Gushwell's F# Programming Diary

タグの表示

すべてのタグ » クラス (RSS)

F#:どう書く?org - 2進数の記述

どう書く?org の 2進数の記述 をF#で解いてみました。 プログラムソースコード中に、2進数を定数として書く方法、あるいはその代替手段を考えてください、というものです。 F#には、0b0011 のような記述が可能ですが、それはおいといて、 以下のような、BinaryNumberクラスを書いてみました。 open System type BinaryNumber(num:int) = let mutable _num = num new (s:string) = new BinaryNumber(Convert...

F#:static プロパティ

ststicプロパティを書くには、memberの前に staticをつけるだけ。 C#とおんなじですね。 type Sample = static member Hoo a = printfn "%A" a let Main() = printfn "Start" Sample.Hoo 100 System.Console.ReadLine() |> ignore do Main() 呼び出すときも、クラス名.メンバー名 です。 プロパティの場合も static...

F#:仮想メソッド

F#で仮想メソッドを書くのはちょっと面倒です。 type BaseClass(x) = do printfn "BaseClass" member this.X : int = x abstract Format : unit -> string default this.Format() = this.X.ToString("#,#") と、abstract で、名前と型を指定したあとに、 defaultで、既定の実装をします。これで仮想メソッドの定義になります...

F#:継承

簡単な継承のサンプルコードを書いてみました。 type BaseClass(x) = do printfn "BaseClass" member p.X : int = x type DelivedClass(x,y) = inherit BaseClass(x) do printfn "DelivedClass" member p.Y : int = y let Main () = let o1 = new BaseClass(10) let o2 = new DelivedClass...
Posted gushwell | 2 comment(s)
分類: , ,

F#:as キーワード (自己識別子)

do 式を使って、インスタンス生成時の初期処理コードを以下のように書こうとしたらエラーとなりました。 type Point(x,y) = do printfn "%d %d" _x _y // error let mutable _x : int = x let mutable _y : int = y new () = new Point(0, 0) member this.X with get() = _x and set(v) = _x <- v member this.Y with...

F#:引数のあるメソッドを定義する

引数のあるメソッドを書いてみました。 Offsetが今回追加したメソッドです。 type Point(x,y) = member this.X : int = x member this.Y : int = y new () = new Point(0, 0) override this.ToString() = sprintf "(%d,%d)" this.X this.Y member this.Offset(x,y) = new Point(this.X + x, this.Y +...

F#:メソッドのoverride

前回のStringメソッドを本来の ToStringにしようと思います。 type Point(x,y) = member p.X : int = x member p.Y : int = y new () = new Point(0, 0) override p.ToString() = sprintf "(%d,%d)" p.X p.Y とoverrideキーワードをつければいいようです。 memberキーワードは不要です。 memberキーワードをつけたままだとエラーになりました。...

F#:メソッド

今日は、メソッドの勉強です。 メソッドを定義するには、memberキーワードを使います。 type Point(x,y) = member p.X : int = x member p.Y : int = y new () = new Point(0, 0) member p.ToString() = sprintf "(%d,%d)" p.X p.Y と書いたら、ToStringのところでコンパイルエラーになりました。 ToStringはobjectに定義済みなので、overrideする必要があるようです...

F#:書き込み可能なプロパティ

いわゆる、getter, setter を書いてみました。 type Point(x,y) = let mutable _x : int = x let mutable _y : int = y new () = new Point(0, 0) member p.X with get() = _x and set(v) = _x <- v member p.Y with get() = _y and set(v) = _y <- v let Main() = let p = new Point(10...

F#:private フィールド

クラス定義のなかでletを使ってみました。 type SampleClass(x,y) = let _x : int = x let _y : int = y new () = new SampleClass(0, 0) let Main() = let o = new SampleClass() printfn "%A" o._x // error do Main() _x, _y は外からは参照できないようです。 Reflectorで確認したら、privateなフィールドになってました...

F#:val と member

前にも書きましたが、 type Point(x,y) = val X : int = x // error val Y : int = y // error new () = new Point(0, 0) だとコンパイルエラーになります。 この場合は、val は使えないようです。 memberとval の違いは何なのでしょうか? reflectorで確認すると 両方とも読み取り専用のプロパティでした。 .ENT上では区別はないようです。 F#の文法上の違いということになりますが、その違いが今の僕にはまだ整理できていません...

F#:コンストラクタ内でフィールドにアクセスする

前々回の記事 で、 type Point = val X : int val Y : int new () = new Point(0, 0) then printfn "new ()" new (x,y) = { X = x; Y = y } then printfn "new (x,y)" と書きましたが、このとき、フィールド X, Y の値を表示しようと type Point = val X : int val Y : int new () = new Point...

F#:コンストラクタ内で初期化以外のコードを書く (2)

パラメータ付きクラスで、コンストラクタ内で初期化以外のコードを書く方法が分かりました。 #BLUEPIXYさんのコメントで知りました。 type Point(x,y) = do printfn "new Point(%d %d)" x y member p.X : int = x member p.Y : int = y new () = new Point(0, 0) then printfn "new Point()" と do キーワードを使うと出来るようです。...

F#:コンストラクタ内で初期化以外のコードを書く

type Point(x,y) = member p.X : int = x member p.Y : int = y new () = new Point(0, 0) というクラスがあった時に、コンストラクタ内で、プロパティの初期化以外の処理を書きたくなったとします。 この書き方が分からず悩みました。 書いたコードが、 type Point = val X : int val Y : int new () = new Point(0, 0) then printfn "new ()" new...

F#:パラメータ付きクラスとプロパティ

クラス定義の続きです。 type Point(x,y) = new () = new Point(0, 0) member p.X = x // ★ member p.Y = y // ★ のように、クラス名の後にパラメータをつけることができます。 こうすることで、 new(x,y) というコンストラクタが、暗黙的に定義されます。 この x, yは、★の部分で初期化に利用されています。 X,Yは、プロパティという扱いで、val ではなく、member を使います。 valだとエラーになりました。 p の部分は...
最新投稿をさらに見る 次ページ »