インターフェイスとジェネリック、どう使う?
R.Tanaka.Ichiro's Blog:インターフェイスでジェネリック
このエントリの流れからきている話です。→R.Tanaka.Ichiro's Blog:インターフェイス(その2)
C#は不得手なのでリンク先のコードをVisual Basicで書いてみた。
んで、このクラスを使ってみたりしたわけです。
[Visual Basic]
Public Interface IGen(Of T)
ReadOnly Property Value() As T
End Interface
Public Class Gen
Implements IGen(Of Integer)
Public ReadOnly Property Value() As Integer Implements IGen(Of Integer).Value
Get
Return 5
End Get
End Property
End Class
Public Class Sample(Of T)
Public Sub New(ByVal g As Gen)
Dim i As IGen(Of T) = DirectCast(g, IGen(Of T))
End Sub
End Class
おもいっきり怒られたー!orz*1
[Visual Basic]
Public Class Program
Public Shared Sub Main()
Dim g As New Gen
Dim s As New Sample(Of Date)(g)
End Sub
End Class
そりゃそーだよね。ってわけでコメント欄にその旨だけ残してみたわけですが。個人的には、Nullさんのコメントにあるようにタイプセーフでないことが気になりますね。
「(Of T)」なだけのジェネリックでは'T'に何が指定されるかわかりません。なので、今回のような実行時エラーを引き起こす可能性が出ちゃうんですね。このあたり、ある程度は(Of T As {Class, New})なんかで何とかなるでしょうけれど、限界はありそうです。今回のようなキャストできることを保証する'T'の制約ってあるのでしょうか?
# コメント欄にC#でコード残してきたことが何よりドキドキした・・・。
*1:キャストデキネーズラーってさ。