Kokudoriing

技術系与太話ブログ

プログラミングF#

絶賛読書中なう。

プログラミングF#

プログラミングF#

ただ、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版楽しみです。