http://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 続行するには何かキーを押してください . . .
まあこれだと使えないことはないか…な?(汗