とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

2008年8月21日 #

Re:拡張メソッドで ref してみる試み

とりこびとです。こんばんは。

昨日 Twitter 呟いたのをRさんに拾っていただきました。これ↓

拡張メソッドで ref してみる試み

ありがとうございます~♪

Visual Basic の言語仕様を読んでいて、拡張メソッドが拡張するデータ型を参照渡しできそうだったので、C#だとどうなの~?って感じでした。

C#だとコンパイラさんに怒られちゃうんですね、ふむふむ。


で、コメント欄でεπιστημηさんがこんなこと書いてました。

VBのばやい、実体を伴わないInterfaceやMustInherit Classに対してByRefしたらどーなるのでしょうか? > とりこ先生

せんせーちゃうわ!


ぢゃなくて。たぶんこうなるだろうな、と思いつつ、昼間は確認できなかったので、さっき書いてみました。この辺とも絡むっぽいです。

まずは Interface 。

Friend Interface IWankumaDirector
    ReadOnly Property Name() As String
End Interface

こんな IWankumaDirector インターフェイスを用意。Name プロパティだけですがw

で、それを実装するクラスを2つ用意してみる。

Friend Class επιστημη : Implements IWankumaDirector
    Public ReadOnly Property Name() As String Implements IWankumaDirector.Name         Get             Return "επιστημη"         End Get     End Property
End Class




Friend
 Class Torikobito : Implements IWankumaDirector
    Public ReadOnly Property Name() As String Implements IWankumaDirector.Name         Get             Return "とりこびと"         End Get     End Property
End Class

これで準備はおしまいです。さて、肝心の拡張メソッドを用意。

Friend Module IWankumaDirectorExtentions
    <System.Runtime.CompilerServices.Extension()> _     Friend Sub ChangeToTorikobito(ByRef d As IWankumaDirector)
        d = New Torikobito
    End Sub
End Module

拡張メソッドが拡張するIWankumaDirector型を参照渡し(ByRef)で受け取って、その中身を入れ替えてます。(Torikobito クラスを代入しなおす。)

ではお試し実行!

Friend Module Program
    Friend Sub Main()
        Dim YokohamaD As IWankumaDirector = New επιστημη ' As でIWankumaDirector 型と明示的に宣言しとく。

        Console.WriteLine("横浜勉強会のディレクターは {0} さんです。", YokohamaD.Name)
        YokohamaD.ChangeToTorikobito()
        Console.WriteLine("横浜勉強会のディレクターは {0} です。", YokohamaD.Name)
    End Sub End Module

結果は…

横浜勉強会のディレクターはεπιστημηさんです。
横浜勉強会のディレクターはとりこびとです。

うん、入れ替わっちゃいますね。


つぎに MustInherit な Class 。…とにかくだだ~っとコードを。

Friend MustInherit Class WankumaDirector
    Friend MustOverride ReadOnly Property Name() As String
End Class
Friend Class επιστημη : Inherits WankumaDirector
    Friend Overrides ReadOnly Property Name() As String         Get             Return "επιστημη"         End Get     End Property
End Class
Friend Class Torikobito : Inherits WankumaDirector
    Friend Overrides ReadOnly Property Name() As String         Get             Return "とりこびと"         End Get     End Property
End Class
Friend Module WankumaDirectorExtentions
    <System.Runtime.CompilerServices.Extension()> _     Friend Sub ChangeToTorikobito(ByRef wankuma As WankumaDirector)
        wankuma = New Torikobito
    End Sub
End Module
Friend Module Program
    Friend Sub Main()
        Dim YokohamaD As WankumaDirector = New επιστημη ' As でWankumaDirector 型と明示的に宣言しとく。
        Console.WriteLine("横浜勉強会のディレクターは{0}さんです。", YokohamaD.Name)
        YokohamaD.ChangeToTorikobito()
        Console.WriteLine("横浜勉強会のディレクターは{0}です。", YokohamaD.Name)     End Sub End Module

Interface の場合とほとんどやり方は変わりません。で、実行…。

横浜勉強会のディレクターはεπιστημηさんです。
横浜勉強会のディレクターはとりこびとです。

うん、入れ替わっちゃいますね。


拡張メソッドの機能としてこれはどうなのかなぁと思ったりもしますが、できるできないと、使う使わないとはまた別の話…かなぁと。



# επιστημηさ~ん、エントリの内容合ってますか?(汗

posted @ 3:56 | Feedback (65)