クラスをクラスのフィールドにする
クラスをクラスのフィールドにする
クラスを丸ごとクラスのフィールドにしたらいいんじゃないか、と今さらながらに気がついた。Javaの本でさんざん目にしていたことなんだけど。
フィールド用のクラス
「GambleRacer」というクラスを作った。
クラスモジュールのコード
Option Explicit 'フィールド Private name_ As String Private racingStyle_ As String Private racingPoints_ As Integer 'アクセサ Public Property Get name() As String name = name_ End Property Public Property Get racingStyle() As String racingStyle = racingStyle_ End Property Public Property Get racingPoints() As Integer racingPoints = racingPoints_ End Property 'コンストラクタ 'メソッド Public Sub setData(ByVal n As String, _ ByVal rs As String, _ ByVal rp As Integer) name_ = n racingStyle_ = rs racingPoints_ = rp MsgBox "データをセットしました。" End Sub Public Sub showMyself() MsgBox "私は" & name_ & "です。" & vbCrLf & _ "得意戦法は" & racingStyle_ & "、" & vbCrLf & _ "競走得点は" & racingPoints_ & "点です。" End Sub
フィールドとして名前、戦法、競走得点の3つを持ち、メソッドとしてデータをセットするsetDataと、自己紹介をするshowMyselfの2つを持つクラス。
GambleRacerをフィールドに持つクラス
「KeirinRace」というクラスを作った。
クラスモジュールのコード
Option Explicit 'フィールド Private gr_ As GambleRacer 'アクセサ Public Property Get gr() As GambleRacer Set gr = gr_ End Property 'コンストラクタ 'メソッド Public Sub setData(ByRef gr As GambleRacer) Set gr_ = gr End Sub Public Sub doKeirin() With gr_ MsgBox .name & "の" & "渾身の" & .racingStyle & "が決まった!" & vbCrLf & _ "さすが" & .racingPoints & "点レーサー!" End With End Sub
フィールドとしてGambleRacerクラスを持ち、データをセットするsetDataと、競輪競走を行う(笑)doKeirinという2つのメソッドを持つクラスにした。
実行
標準モジュールに次のコードを書いて実行してみた。
標準モジュールのコード
Sub test() Dim kr As KeirinRace '……(1)' Set kr = New KeirinRace '……(2)' Dim gr As GambleRacer '……(3)' Set gr = New GambleRacer '……(4)' gr.setData "中野 浩一", "捲り", 120 '……(5)' gr.showMyself '……(6)' kr.setData gr '……(7)' kr.doKeirin '……(8)' Set gr = Nothing Set kr = Nothing End Sub
コードの説明
説明することに意義があるかどうかは不明なれど……。
- (1)でKeirinRaceクラスの変数を準備。
- (2)でKeirinRaceクラスのインスタンスを生成。
- (3)でGambleRacerクラスの変数を準備。
- (4)でGambleRacerクラスのインスタンスを生成。
- (5)で、GambleRacerクラスのsetDataメソッドを用いて各データをセット。こんなの、本来コンストラクタでやることですが。
- (6)で、GambleRacerクラスのshowMyselfメソッドを用いて自己紹介させる。
- (7)で、KeirinRaceクラスのsetDataメソッドを用いてデータをセット。引数としてGambleRacerクラスのインスタンスを渡している。
- (8)で、KeirinRaceクラスのdoKeirinメソッドを実行。
実行結果
GambleRacerクラスのsetDataメソッドが実行された証。
GambleRacerクラスのshowMyselfメソッドが実行された。
KeirinRaceクラスのdoKeirinメソッドも無事実行された。
おわりに
ちょっと今まで「クラスの独立性」という概念を勘違いしていたのかも。まだまだ勉強が足りませんな。