まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

デザインパターンを学ぶ~その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

# シャネルバッグコピー 2021/11/21 4:55 oorudyalapt@live.com

とても信頼の出来るショップ様に出逢えた事
嬉しく思います☆
手書きのメッセージに暖かさを感じるショップ様は初めてで感謝しています。
今後も何度かお世話になります。
★ルイヴィトン★モノグラム★アジェンダPM★6穴式システム手帳カバー★R20005★
最初は期待はしておらず
使えれば…と思っていました。
でも…新品と思うくらいの品物を凄く低価格で買わせて頂きましたo
凄く驚きました!
大満足しております
シャネルバッグコピー https://www.nawane111.com

タイトル
名前
Url
コメント