まさるblog

越後在住アプリケーションエンジニア奮闘記

目次

Blog 利用状況

ニュース

07/04/23
新規加入しました。
よろしくお願いします。

07/06/02
東京勉強会#8に参加しました。

07/10/21
情報処理技術者試験(NW)受験しました。

07/11/17
オブジェクト指向分科会#2参加しました。

07/12/06
SOFTWARE TOYBOXオープンしました。

08/03/02
息子誕生しました。

08/03/05
twitterはじめました。

現在
子育て奮闘中です。
デザインパターン勉強中です。
iKnow!、ESLPodcastなどで英語勉強中です。

ブログパーツ

あわせて読みたい

書庫

日記カテゴリ

コミュニティ

色々

デザインパターンを学ぶ~その12:ちょっとだけDecoratorパターン(2)~

続いてその7のVB版。

 

VB Code
' 性別列挙対
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

    ' ToStringメソッド
    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)

    ' ToStringメソッド
    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

' Hoge会社クラス
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())
    ' Hoge会社のインスタンス生成
    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にも是非匿名メソッドが欲しくなりますね。

投稿日時 : 2007年8月17日 14:30

Feedback

No comments posted yet.
タイトル  
名前  
Url
コメント