まさる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などで英語勉強中です。

ブログパーツ

あわせて読みたい

書庫

日記カテゴリ

コミュニティ

色々

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

今回はその6のDecoratorパターンをVBに直します。(コードが長くなるので、3回に分けます。)

 

では早速、まずはその6のコードから。

 

VB Code
' 食品抽象クラス
Public MustInherit Class AbstractFood

    ' 説明フィールド
    Protected _description As String = "食品の説明"

    ' 説明プロパティ
    ' ※オーバーライド可能プロパティとして定義
    Public Overridable ReadOnly Property Description() As String
        Get
            Return Me._description
        End Get
    End Property

    ' 価格取得
    Public MustOverride Function GetPrice() As Decimal

End Class

' デコレータ抽象クラス
Public MustInherit Class AbstractDecorator
    Inherits AbstractFood

    ' 説明プロパティ
    ' ※ここでオーバーライドするために、
    '   AbstractFoodクラスでは仮想プロパティとした
    Public MustOverride Overrides ReadOnly Property Description() As String

End Class

' 牛丼クラス
Public Class Gyudon
    Inherits AbstractFood

    Public Sub New()
        Me._description = "牛丼"
    End Sub

    ' 価格取得メソッド
    Public Overrides Function GetPrice() As Decimal

        Return 380D

    End Function

End Class

' キムチデコレータ
Public Class Kimuchi
    Inherits AbstractDecorator

    ' 被装飾者格納用変数
    Private _food As AbstractFood

    ' コンストラクタ
    ' ※被装飾者のインスタンスを格納する
    Public Sub New(ByVal food As AbstractFood)

        Me._food = food

    End Sub

    ' 説明プロパティ
    Public Overrides ReadOnly Property Description() As String
        Get
            ' 被装飾者の説明に追加する
            Return Me._food.Description + ",キムチ"
        End Get
    End Property

    ' 価格取得
    Public Overrides Function GetPrice() As Decimal

        ' 被装飾者の価格に追加する
        Return Me._food.GetPrice() + 100D

    End Function

End Class

' つゆだくデコレータ
Public Class Tsuyudaku
    Inherits AbstractDecorator

    ' 被装飾者格納用変数
    Private _food As AbstractFood

    ' コンストラクタ
    ' ※被装飾者のインスタンスを格納する
    Public Sub New(ByVal food As AbstractFood)

        Me._food = food

    End Sub

    ' 説明プロパティ
    Public Overrides ReadOnly Property Description() As String
        Get
            ' 被装飾者の説明に追加する
            If TypeOf Me._food Is Tsuyudaku Then
                Return Me._food.Description + "だく"
            Else
                Return Me._food.Description + ",つゆだく"
            End If
        End Get
    End Property

    ' 価格取得
    Public Overrides Function GetPrice() As Decimal

        ' 被装飾者の価格に追加する
        Return Me._food.GetPrice() + 0D

    End Function

End Class

' 実行コード
Public Shared Sub Main(ByVal args As String())

    ' 牛丼を注文
    Dim order As AbstractFood = New Gyudon()

    ' 現在の注文を確認
    Console.WriteLine("説明:{0}", order.Description)
    Console.WriteLine("価格:{0:N} 円", order.GetPrice())

    ' キムチをトッピング
    order = New Kimuchi(order)

    ' 現在の注文を確認
    Console.WriteLine("説明:{0}", order.Description)
    Console.WriteLine("価格:{0:N} 円", order.GetPrice())

    ' つゆだく追加
    order = New Tsuyudaku(order)

    ' 現在の注文を確認
    Console.WriteLine("説明:{0}", order.Description)
    Console.WriteLine("価格:{0:N} 円", order.GetPrice())

    ' さらにつゆだく追加
    order = New Tsuyudaku(order)

    ' 現在の注文を確認
    Console.WriteLine("説明:{0}", order.Description)
    Console.WriteLine("価格:{0:N} 円", order.GetPrice())

    Console.ReadLine()

End Sub

実行結果

説明:牛丼
価格:380.00 円
説明:牛丼,キムチ
価格:480.00 円
説明:牛丼,キムチ,つゆだく
価格:480.00 円
説明:牛丼,キムチ,つゆだくだく
価格:480.00 円

 

いかがでしょうか?

 

今回のポイントはC#とVBのキーワードの違いですかね。(以下C# <=> VB)

  • abstract class <=> MustInherit Class
  • abstract [メソッド/プロパティ] <=> MustOverride [メソッド/プロパティ]
  • virtual <=> Overridable
  • override <=> Overrides

 

あと、読み取り専用プロパティの書き方もちがいますね。

  • C#:getアクセサのみコードを書く。
  • VB:プロパティ宣言で「ReadOnly」キーワードが必要。そのうえで、Getアクセサのみコードを書く。

 

この辺りをしっかりと理解しておけば、C#<=>VBの読み替えもそれほど苦にはならないと思います。

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

Feedback

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