Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@triple321jhango

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

More than 1 year has passed since last update.

【あらすじ】

前回、VBAフォーム、DB接続クラス化入門①でフォームを使用してDB接続する記事を投稿したが、今回は、プロパティ、メソッドについて解説したいと思う。

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

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

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
'--------------------------------------------------------------------

【そもそもプロパティ、メソッドとは?】


オブジェクトには

  • プロパティ
  • メソッド

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

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

初代御三家のヒトカゲ、ゼニガメ、フシギダネにはそれぞれ、「属性」「技」を持っている

これがプロパティだ。

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

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

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

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

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

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

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からアクセスして、ダメージを与える処理、要するに動作(メソッド)
の処理が行われる

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

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

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

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

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

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

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です。

【参考】


5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
triple321jhango
医療事務10年勤務を退職➡︎2018.7~SES転職➡︎解らなすぎて挫折➡︎復活/1児の父 知識0からでも学習継続でコードは書けるようになります。 スキル(VBA,SQL,GitHub,PHP基礎) 現在はHTML/CSS/PHP学習中 Dockerも後々予定

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?