プログラミングF#
絶賛読書中なう。
- 作者: Chris Smith,頃末和義,鈴木幸敏
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/08/26
- メディア: 大型本
- 購入: 4人 クリック: 47回
- この商品を含むブログ (19件) を見る
ただ、158ページ、159ページでこんなことが。
インターフェイスを他のインターフェイスから継承させ、
派生したインターフェイスで最初のインターフェイスの契約を拡張することもできます。
しかし、派生したインターフェイスを使用する場合は継承関係にある
すべてのインターフェイスを完全に実装しなければなりません。プログラミングF# P159
そして下に例が。
type IDoStuff = abstract DoStuff : unit -> int type IDoMoreStuff = inherit IDoStuff abstract DoMoreStuff : unit -> unit // エラー : インターフェイスの階層構造すべてを実装していない type Foo() = interface IDoMoreStuff with override this.DoMoreStuff() = printfn "仕事を遂行中..."
これはわかる。非常にわかる。
これは C# がインターフェイスを扱う方法と異なる点の1つといえます。
派生インターフェイスを実装したいにもかかわらず、
基底インターフェイスも明示的に実装しなければいけないことは奇妙に思えるかもしれません。
...略プログラミングF# P159
…C# と異なる?
interface IDoStuff { void DoStuff(); } interface IDoMoreStuff : IDoStuff { void DoMoreStuff(); } // エラー: 'Foo' はインターフェイス メンバー 'IDoStuff.DoStuff()' を実装しません。 class Foo : IDoMoreStuff { public void DoMoreStuff() { Console.WriteLine("仕事を遂行中..."); } }
まぁ、もちろん C# でもコンパイルできないわけでして。
んー、違う意味で言ってるんですかね。
というか継承関係のすべてのインターフェイスを実装しなかったら、
new Foo() as IDoMoreStuff でいずれかのメソッドが未定義なわけで…。
CLI レベルで許されないと思うのですが。
これは単に間違いなのか、僕の読解力がアレなのか。
「完全に実装」って部分が重要なのかそうでないのか。
2012/09/27 追記
訳者の方からコメント頂きました。
Chris Smith氏に確認したところ、「C#と違う」という一文は誤りで、F#もC#もインターフェイスの扱い方に違いはなく、現在執筆中の第2版では既に該当の文章を削除してあるとのことです。
とのことです。
因みに。
O'Reilly Japanの方にも連絡して、機会があれば日本語版にも修正を反映できるようにしておきたいと思います。
F#3.0 出ましたしね。第2版楽しみです。