オブジェクト指向（プロパティ、メソッド）をポケモンを使って考えてみる

###【あらすじ】
前回、[VBAフォーム、DB接続クラス化入門①](https://qiita.com/triple321jhango/items/14efb6adf157b3d3e5b1)でフォームを使用してDB接続する記事を投稿したが、今回は、プロパティ、メソッドについて解説したいと思う。

以下のソースのテキストボックスに入力された値をローカル変数に格納していたが、<b>Property</b> を使用して、プロパティ値を取得、メソッドの処理を以下のソースとは別に、例を用いていく。

前回までのソースは以下の通り

```VB:frmSearch
Option Explicit
'--------------------------------------------------------------------
'変数宣言
'--------------------------------------------------------------------
	Private lstrId             As String
	Private lstrUser_name      As String
	Private lstrEmail          As String
	Private lstrStatus         As String
	Private lstrInsDatefrom    As String
	Private lstrInsDateTo      As String

'--------------------------------------------------------------------
'機能：bbsへDB接続
'test_user_data_hedに登録されているテーブルデータをリストへ表示するためのトリガー
'--------------------------------------------------------------------
Public Sub select_cmd_Click()
    Dim dbconnect   As mysql_connect
    Dim ladoRs      As ADODB.Recordset   'ローカルレコードセット変数
    Dim ConnectFlg  As Boolean           '接続成功: True   接続失敗:False
    Dim lstrSQL1    As String            'ローカルsql格納変数
    Dim lintroop    As Integer           'ループ変数
    '例外処理⇒以下の記述でエラーが発生した場合にはエラーメメッセージ表示
On Error GoTo ErrHandler_End

'------------------【プロパティを用いた記述にできる部分】---------------
    lstrId = ID_txt.Text
    lstrUser_name = UserName_txt.Text
    lstrEmail = Email_txt.Text
    lstrInsDatefrom = InsDate_from_txt.Text
    lstrInsDateTo = InsDate_to_txt.Text
'--------------------------------------------------------------------
```
###【そもそもプロパティ、メソッドとは？】
***
オブジェクトには

- <b>プロパティ</b>
- <b>メソッド</b>

がある。
プロパティとはオブジェクトの属性や状態を指す。
辞書で調べてみると、特質、特性、などとも書かれている。
メソッドはオブジェクトの動作を指す。
こちらも辞書で調べてみると、作法、方法、などと書かれている。
はっきり言って、これだけでは全くしっくりこないので、例を出して考えてみる。

どこかで見たことがある記憶もあるかもしれないが、ポケモンを例に出して、
プロパティ、メソッドを解説してみたいと思う。

初代御三家のヒトカゲ、ゼニガメ、フシギダネにはそれぞれ、<b>「属性」「技」</b>を持っている
####これがプロパティだ。

- ヒトカゲのプロパティは<b>「炎」</b>
- ゼニガメのプロパティは<b>「水」</b>
- フシギダネのプロパティは<b>「草」「毒」</b>

上記に加え、それぞれ<b>「技」</b>を持っている

####次に「攻撃」、これがメソッド。

- ヒトカゲのメソッドは
<b>「ひっかく」「ひのこ」「なきごえ」</b>など
- ゼニガメのメソッドは
<b>「体当たり」「みずでっぽう」「しっぽをふる」</b>など
- フシギダネのメソッドは
<b>「体当たり」「やどりぎのたね」「つるのむち」</b>など
上記で前述した動きを表すものになっている。

これをオブジェクト指向的にまとめると
ポケモンというクラスから、ヒトカゲ、ゼニガメ、フシギダネというインスタンスを作って、プロパティ（属性値、技）、メソッド（技の攻撃）を定義することなる。

コードにしてみると、こういうことではないだろうか。
(ソースではヒトカゲの例で解説したいと思います。)

```VB:frmPokemonPictureBbook
'-----------------------------------------------------------
'ポケモンクラスオブジェクトの作成
'-----------------------------------------------------------
Dim objHitokage    As Pokemon
Dim lAttribute     As String       'ローカルで使用する属性変数
Dim lAttack        As String       'ローカルで使用する攻撃変数

'ヒトカゲのインスタンス化（New演算子を使ってヒトカゲの実態を生成、ヒトカゲが産まれた）
Set objHitokage = New Pokemon     
'Pokemonクラスの属性プロパティにアクセス（Attribute_txt.textには炎を入力したと仮定）
objHitokage._Attribute = Attribute_txt.text
'Pokemonクラスのプロパティから属性を取得
lAttribute = objHitokage._Attribute

'Pokemonクラスの技プロパティにアクセス（Skill_txt.textにはひのこを入力したと仮定）
objHitokage._Skill = Skill_txt.text
'Pokemonクラスのプロパティから技を取得
lAttack = objHitokage._Skill

'引数を持たないポケモンクラスの_Attackメソッドにアクセス。
Call objHitokage._Attack

```
以下の
ポケモンクラスではfrmのtextに入力された値をプロパティ側でセットする処理（プロパティ）
_Attackメソッドにfrmからアクセスして、ダメージを与える処理、要するに動作（メソッド）
の処理が行われる

```VB:clsPokemon
'-----------------------------------------------------------
'ポケモンプロパティ値の設定変数
'-----------------------------------------------------------
Private mAttribute As String   '属性
Private mSkill     As String   '技
_______________________________________________________________________
'-----------------------------------------------------------
'プロパティ設定
'-----------------------------------------------------------
'vstrvalには「炎」という値が入っていて、プロパティ属性:mAttributeに「炎」をセット
Public Property Let _Attriibute (ByVal vstrval As String)
     mAttribute = vstrval
End Property
_______________________________________________________________________
'LetでmAttributeに「炎」がセットされた値をfrm側へ返す
Public Property Get _Attriibute () As String
     _Attriibute = mAttribute
End Property
_______________________________________________________________________
'vstrvalには「ひのこ」という値が入っていて、プロパティ技:mSkillに「ひのこ」をセット
Public Property Let _Skill (ByVal vstrval As String)
     mSkill = vstrval
End Property
_______________________________________________________________________
'LetでmSkillに「ひのこ」がセットされた値をfrm側へ返す
Public Property Get _Skill () As String
     _Skill = mSkill
End Property
_______________________________________________________________________

'-----------------------------------------------------------
'メソッドの実行（引数がない場合）
'-----------------------------------------------------------
'_Attackメソッド（攻撃）がヒットしたらダメージを与えるか否かの動き
Public Sub _Attack() 
  Const low  As Integer = 1   '乱数low
  Const high As Integer = 3   '乱数high
  Dim i      As Integer       '乱数値格納変数　
  Dim Damage As Integer       'ダメージ変数
  
  '1～3までの乱数値を設定
  i = Int((high - low + 1) * Rnd + low)
  
'乱数値が1だった場合は10ダメージ与える,それ以外の場合はミス判定とし、0ダメージとする
  If  i = 1 Then
    Damage = 10
  Else
    Damage = 0
  End If  
  
End Sub
```

上記の記述でプロパティ値に属性、技をセットすることができた。
また、メソッドの処理では、ダメージを与えることができたが、引数を使用した書き方ではなかった為、ダメージを与えるのみの動きだったが、

以下の部分で、引数がある書き方にすると、呼び出し側では<b>「Call」</b>ではなく、objHitokage._Attackメソッドに対して、(lAttack)で引数、攻撃（ひのこ）を渡して、状態異常の判定を行うことができる。
技が「ひのこ」だった場合に、状態異常FlgがTureとなり火傷を負わせる、Falseであれば、通常のままという処理にしてみたいと思う。
lStatusFlgを新たに宣言。

```VB:frmPokemonPictureBook
  Dim lStatusFlg  As Boolean   '状態異常フラグを新たに宣言

  'frmから、_Attackメソッドに引数lAttack(ひのこに設定した)を渡す。
  'True:火傷  False:通常
  lStatusFlg = objHitokage._Attack(lAttack)  
```

引数がある場合、先ほどと異なるのが、メソッド側では、Public <b>Sub</b> ⇒ Public <b>Function</b>となり、
<b>(ByVal strAttack As String)</b>で引数lAttackをもらい、As Boolean型で攻撃がひのこだった場合で、なおかつ攻撃が当たった場合には、火傷を負わせるという判定を行うメソッドにする。


```VB:clsPokemon
'-----------------------------------------------------------
'メソッドの実行（引数がある場合）
'-----------------------------------------------------------
'_Attackメソッド（攻撃）がヒットした場合となおかつ、攻撃がひのこだった場合、火傷を
'負わせる
Public Function _Attack(ByVal strAttack As String) As Boolean 
  Const low  As Integer = 1   '乱数low
  Const high As Integer = 3   '乱数high
  Dim i      As Integer       '乱数値格納変数
  Dim Damage As Integer       'ダメージ変数
  
  '一度初期化
  _Attack = False
  '1～3までの乱数値を設定
  i = Int((high - low + 1) * Rnd + low)

  '引数で渡ってきた技がひのこであり、なおかつ乱数値が1だった場合は、ダメージを与え、
  '状態異常値にTrue(火傷のフラグ)を返す
  If strAttack = "ひのこ" And i = 1 Then 
    Damage = 10
    _Attack = True
  Else
    Damage = 0
    _Attack = False
  End If  
  
End Sub
```

以上がポケモンを例にした、プロパティ、メソッドについての解説です。
処理自体は簡単なものを例として記載したつもりです。
まだまだ未熟ゆえわかりづらい点があったかと思いますm(_ _)m
ほとんどの方はなじみのあるポケモンを例に出すことで、イメージがしやすいかと思い、上記のような投稿をしてみましたが、ポケモンじゃなくても、FFでもドラクエでもイメージしやすいものであれば、なんでも良いと思う。
FFならジョブ、魔法、召喚獣など。
ドラクエなら職業、特技など。

以下はオブジェクト指向について参考にさせていただいたURLです。

###【参考】
***
- [VBAのプロパティとは | ExcelのVBA入門](https://www.vba-ie.net/object/property.php#a1)
- [PHPオブジェクト指向入門（前半）](https://qiita.com/mpyw/items/41230bec5c02142ae691)
- [ポケモン徹底攻略](https://yakkun.com/swsh/)
- [VBA Rnd 関数](https://www.tipsfound.com/vba/05rnd)