続いてその7のVB版。
Public Enum Sex
Male
Female
End Enum
Public Class Employee
Public Age As Integer
Public Sex As Sex
Public Name As String
Public Sub New(ByVal age As Integer _
, ByVal sex As Sex, ByVal name As String)
Me.Age = age
Me.Sex = sex
Me.Name = name
End Sub
Public Overrides Function ToString() As String
Return String.Format("Age:{0}, Sex:{1}, Name:{2}" _
, Me.Age, Me.Sex, Me.Name)
End Function
End Class
Public MustInherit Class AbstractFilter
Public MustOverride Function GetEmployees() As List(Of Employee)
Public Overrides Function ToString() As String
Dim sb As New StringBuilder()
For Each emp As Employee In Me.GetEmployees()
sb.Append("- ")
sb.Append(emp.ToString())
sb.Append(Environment.NewLine)
Next
Return sb.ToString()
End Function
End Class
Public Class HogeCompany
Inherits AbstractFilter
Protected _employees As List(Of Employee)
Public Sub New(ByVal employees As List(Of Employee))
Me._employees = employees
End Sub
Public Overrides Function GetEmployees() As List(Of Employee)
Return Me._employees
End Function
End Class
Public Class AgeFilter
Inherits AbstractFilter
Private _minAge As Integer
Private _maxAge As Integer
Private _abstractFilter As AbstractFilter
Public Sub New(ByVal minAge As Integer, ByVal maxAge As Integer _
, ByVal abstractFilter As AbstractFilter)
Me._minAge = minAge
Me._maxAge = maxAge
Me._abstractFilter = abstractFilter
End Sub
Public Overrides Function GetEmployees() As List(Of Employee)
Return Me._abstractFilter.GetEmployees() _
.FindAll(AddressOf IsInRangeAge)
End Function
Private Function IsInRangeAge(ByVal employee As Employee) As Boolean
Return (Me._minAge <= employee.Age And employee.Age <= Me._maxAge)
End Function
End Class
Public Class SexFilter
Inherits AbstractFilter
Private _sex As Sex
Private _abstractFilter As AbstractFilter
Public Sub New(ByVal sex As Sex, ByVal abstractFilter As AbstractFilter)
Me._sex = sex
Me._abstractFilter = abstractFilter
End Sub
Public Overrides Function GetEmployees() As List(Of Employee)
Return Me._abstractFilter.GetEmployees() _
.FindAll(AddressOf IsSameSex)
End Function
Private Function IsSameSex(ByVal employee As Employee) As Boolean
Return (employee.Sex = Me._sex)
End Function
End Class
Public Shared Sub Main(ByVal args As String())
Dim hogeCompany As New HogeCompany( _
New List(Of Employee)( _
New Employee() { _
New Employee(18, Sex.Male, "太郎") _
, New Employee(25, Sex.Female, "幸子") _
, New Employee(22, Sex.Male, "浩二") _
, New Employee(35, Sex.Female, "茜") _
, New Employee(30, Sex.Female, "葉月") _
, New Employee(27, Sex.Male, "智") _
} _
) _
)
Console.WriteLine("■全社員")
Console.WriteLine(hogeCompany)
Console.WriteLine("■性別男性でフィルタリング")
Dim sexFilter As New SexFilter(Sex.Male, hogeCompany)
Console.WriteLine(sexFilter)
Console.WriteLine("■20歳以上、30歳以下でフィルタリング")
Dim ageFilter As New AgeFilter(20, 30, sexFilter)
Console.WriteLine(ageFilter)
Console.ReadLine()
End Sub
実行結果
■全社員
- Age:18, Sex:Male, Name:太郎
- Age:25, Sex:Female, Name:幸子
- Age:22, Sex:Male, Name:浩二
- Age:35, Sex:Female, Name:茜
- Age:30, Sex:Female, Name:葉月
- Age:27, Sex:Male, Name:智
■性別男性でフィルタリング
- Age:18, Sex:Male, Name:太郎
- Age:22, Sex:Male, Name:浩二
- Age:27, Sex:Male, Name:智
■20歳以上、30歳以下でフィルタリング
- Age:22, Sex:Male, Name:浩二
- Age:27, Sex:Male, Name:智
今回のポイントはPredicate(Of T)デリゲートを使用する際に、C#は匿名メソッドが使えるけれども、VBは別にメソッドを作らないといけないところです。
こういうことをやっていると、VBにも是非匿名メソッドが欲しくなりますね。