« LINQ独自拡張時の遅延実行 | トップページ | Expression Web 2の第一印象 »

2008年6月 9日 (月)

VB2008ではインターフェースにメソッドを実装できます

VB2008には言語自体に新機能がたくさんあるので、いまだに新しい発見をします。

先日、インターフェースにメソッドを定義する方法があることを発見しました。次のコードは有効なコードです。

Dim s As INullPulg
s.Say()

もちらんINullPulgはクラスではなくインターフェースですよ。インチキはしていません。

上記コードを動作させるために全体のコードも紹介します。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim s As INullPulg

        s.Say()

    End Sub
End Class

Public Interface INullPulg
End Interface

Public Module ExtensionModule
    <System.Runtime.CompilerServices.Extension()> _
    Public Sub Say(ByVal plug As INullPulg)
        MsgBox("こんにちは!")
    End Sub
End Module

Windowsフォームアプリケーションにこれだけ書けば実際に試せます。

要は拡張メソッドを使っているのですがインターフェースにも拡張メソッドを持たせられるということがちょっと驚きです。このことがどう影響するか今後じっくり考えてみたいです。

この例ではINullPlugを実装したクラスにも自動的にSayメソッドの「実装」が備え付けられます。内部的にはどういう仕組みになっているんでしょうか?一度ILを解剖してみたいです。

このことに気がついたのはLINQで使用するメソッド(LINQの演算子)がIEnumerable(Of …)の拡張メソッドであるという話をよく考えてみたことがきっかけです。

|

« LINQ独自拡張時の遅延実行 | トップページ | Expression Web 2の第一印象 »

コメント

もう理解されてるかもしれませんが、Extensionはメソッドを実際に増やすものではなく、仮想的に追加するだけですよ。
この例についていうと
  s.Say() → Say(s)
のようにコンパイル時にSub,Functionの第一パラメータに渡される形で置き換えられます。

投稿: 通りがかりの者 | 2009年2月17日 (火) 16時10分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/197542/41484799

この記事へのトラックバック一覧です: VB2008ではインターフェースにメソッドを実装できます:

« LINQ独自拡張時の遅延実行 | トップページ | Expression Web 2の第一印象 »