スポンサーサイト

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

F#入門第43回(OOP(8)インターフェイス(2))

今回のお題は「OOP(8)インターフェイス(2)」です。
 
まずは、インターフェイスとそれを実装したクラスの例を再掲します。

type ImyNumable =
    abstract Num: int
    abstract ShowNum : unit -> unit
    
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
    interface ImyNumable with
        member this.Num =
                 List.length lst
        member this.ShowNum () =
                 printfn "要素数は%dです" (List.length lst) 
 
さてこの、MyIntStackクラスからダミーのプロパティをひとつ加えたMyDevIntStack クラスを派生させます。
 
type MyDevIntStack () =
    inherit MyIntStack ()
    member this.Dammy = 
            printfn "this is dammy method"
 
(F#Interactiveでの表示)
 
type MyDevIntStack =
  class
    inherit MyIntStack
    new : unit -> MyDevIntStack
    member Dammy : unit
  end
  
インスタンスを一つ生成して、ImyNumable型にキャストして、ShowNumメソッドを呼び出してみます。
 
> let t = new MyDevIntStack();;
val t : MyDevIntStack
 
> let ti = t :> ImyNumable;;
val ti : ImyNumable
 
> ti.ShowNum();;
要素数は0です
val it : unit = ()
 
ということで、ちゃんと派生先のクラスもインターフェイス(資格証明)を継承していることが分かりました。
 
次にインターフェイスの継承です。
インターフェイスは実装すべきプロパティ、メソッドの条件書ですから、インターフェイスの継承というのは、さらに実装すべきプロパティ、メソッドを付け足すことに他ありません。
例えば
 
type ImyNumable =
    abstract member Num :int
    abstract member ShowNum : unit -> unit
 
を継承してImyNumableRank2を定義してみます。(inheritキーワードを使います)
 
type ImyNumableRank2 =
    inherit ImyNumable
    abstract member MoreToDo : unit -> unit
 
(F#Interactiveでの実行例)
type ImyNumableRank2 =
  interface
    inherit ImyNumable
    abstract member MoreToDo : unit -> unit
  end
 
ImyNumableRank2認定を受けるには、ImyNumableで定められているNum,ShowNumに加えてMoreToDoメソッドを実装する必要があるということになります。
それではImyNumableRank2をクリア(実装)しているクラスは、ImyNumableをクリアしているとみなされるのでしょうか。実験してみます。MyIntStackの定義を少し変えます。
 
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
    interface ImyNumableRank2 with
        member this.Num =
                 List.length lst
        member this.ShowNum() =
                    printfn "要素数は%dです" (List.length lst) 
        member this.MoreToDo () =
                    printfn "ダミーです。"
 
実行例
> let t = new MyIntStack();;
val t : MyIntStack
 
> let ti = t :> ImyNumable ;;
val ti : ImyNumable
 
> ti.ShowNum();;
要素数は0です
val it : unit = ()
 
ということで、ImyNumableRank2をクリア(実装)しているクラスは、ImyNumableをクリアしているとみなされることが分かりました。
スポンサーサイト

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

コメントの投稿

非公開コメント

継承のテスト


type ImyNumable =
abstract Num:unit -> int //unit -> が要らない!、なんでまた?
abstract ShowNum : unit -> unit

ImyNumableをクリアしているかどうか調べるためには、
:> してエラーにならなければOKだけど、
プログラム的には、それではまずいので、
>((t :>obj) :? ImyNumable);;
val it : bool = true
とかして調べられますね。

No title

またまた変なミスをしてしまってすいません。たぶん、ImyNumableインターフェイスの実装クラスを訂正したのに、こちらの原稿の方を直し忘れたのだと思われます。訂正しました。
またインターフェイスをクリアするかどうかの判定法御教授ありがとうございます。(obj型に一度キャストするのですね。)

判定法

>判定法御教授ありがとうございます。
いえいえ、こちらこそいつも勉強させて頂いております。
もう既に知ってたら、(知らないフリをさせて)すみません。
他に良い方法ないですかね?

>obj型に一度キャストするのですね。
そうです、(できるんかな?とか思うんですけどw)直接はできません。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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