とりこびとです。こんばんは。
昨日 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 επιστημη
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 επιστημη
Console.WriteLine("横浜勉強会のディレクターは{0}さんです。", YokohamaD.Name)
YokohamaD.ChangeToTorikobito()
Console.WriteLine("横浜勉強会のディレクターは{0}です。", YokohamaD.Name)
End Sub
End Module
Interface の場合とほとんどやり方は変わりません。で、実行…。
横浜勉強会のディレクターはεπιστημηさんです。
横浜勉強会のディレクターはとりこびとです。
うん、入れ替わっちゃいますね。
拡張メソッドの機能としてこれはどうなのかなぁと思ったりもしますが、できるできないと、使う使わないとはまた別の話…かなぁと。
# επιστημηさ~ん、エントリの内容合ってますか?(汗