https://ooltcloud.sakura.ne.jp/blog/201406/article_11235313.html を改良してみた。修正点は以下。
- Either を Interface から Super Class に変えた。
- Either に Match メソッドを追加した。
Class Either(Of A, B)
Protected _right As A
Protected _left As B
Sub Match(Right As Action(Of A), Left As Action(Of B))
Select Case Me.GetType
Case GetType(Right(Of A, B))
Right(_right)
Case GetType(Left(Of A, B))
Left(_left)
End Select
End Sub
End Class
Class Right(Of A, B)
Inherits Either(Of A, B)
Sub New(obj As A)
_right = obj
End Sub
End Class
Class Left(Of A, B)
Inherits Either(Of A, B)
Sub New(obj As B)
_left = obj
End Sub
End Class
こうすることで使用側のコードは多少すっきりした…と思う(汗
Enum ErrorCode
SyntaxError
End Enum
Module Module1
Sub f(obj As Either(Of Tuple(Of Integer, Integer), ErrorCode))
Dim isSucess = False
Dim y As Double = 0
obj.Match(Right:=Sub(x)
isSucess = True
y = x.Item1 + x.Item2
End Sub,
Left:=Sub(x)
isSucess = False
Console.WriteLine(x.ToString)
End Sub)
If isSucess = False Then Exit Sub
Console.WriteLine("{0}", y)
End Sub
Sub Main()
Dim a = New Right(Of Tuple(Of Integer, Integer), ErrorCode)(Tuple.Create(100, 200))
f(a)
Dim b = New Left(Of Tuple(Of Integer, Integer), ErrorCode)(ErrorCode.SyntaxError)
f(b)
End Sub
End Module
結果
300 SyntaxError 続行するには何かキーを押してください . . .
まあこれだと使えないことはないか…な?(汗