クラス
■概要
クラスは特定の機能を実行するために必要な関数や変数をまとめることができる機能のことです。
クラスを使用することによりオブジェクト単位でプログラムを考えることができるようになるので、
オブジェクト指向型のプログラミングが可能となります。
■宣言と使用
●宣言
書式例:
class クラス名
End class
具体例:
class TestClass
private m_Val1 As Long
public Function GetVal1() As Long
GetVal1 = m_Val1
End Function
public Sub SetVal1(ByVal val)
m_Val1 = val
End Sub
End Class
●使用
書式例:
書式①:
Dim 変数名 As New クラス名
書式②:
Dim 変数名 As クラス名
Set 変数名 = New クラス名
具体例:
Class Test
public m_Val As Long
End Class
Sub TestSub
' 書式①
Dim test1 As New Test
' 書式②
Dim test2 As Test
test2 = New Test
End Sub
■アクセス指定子
アクセス指定子とはクラスのメンバの使用できる範囲を指定することができる識別子のことです。
よく使用する識別子として「Public」「Private」「Protected」があります。
●指定子の種類
・Public
クラスの内と外で使用可能
・Private
クラスの中で使用可能
・Protected
クラスの中と継承先のクラスで使用可能
■メンバの宣言
クラスのメンバは変数と関数を指しており、クラス内で宣言することで
インスタンス化した際にそれらのメンバを使用することができます。
●メンバ変数の宣言
・書式
書式例:
アクセス指定子 変数名 As データ型
具体例:
Private m_TestVal As Long
●メンバ関数の宣言(Sub)
・書式
書式例:
アクセス指定子 Sub 関数名(引数)
End Sub
具体例:
Public Sub Test01(ByVal val As Long)
End Sub
●メンバ関数の宣言(Function)
・書式
書式例:
アクセス指定子 Function 関数名(引数) As データ型
End Sub
具体例:
Public Function AddSum(ByVal v1 As Long, ByVal v2 As Long) As Long
AddSum = v1 + v2
End Sub
■プロパティ
プロパティはクラスや構造体のメンバ変数に設定できる機能です。
このプロパティを設定するとPrivateやProtectedでアクセスできないようにしている
メンバ変数に対して取得や変更ができるようになります。
メンバ変数を取得するためのプロパティ関数には「Get」を
変更するためのプロパティ関数には「Set」を使用します。
●宣言
・書式例
' m_Val変数に対してのプロパティ設定
Class Test
' プロパティで使用する変数を宣言
Private m_Val As Long
' プロパティ宣言開始
Public Property Val() As Integer
アクセス指定子 Property 関数名 As データ型
アクセス指定子 Get
Return m_Val
End Get
アクセス指定子 Set(ByVal 変数 As データ型)
m_Val = 変数
End Set
' Get、Setのアクセス指定子を省略した際は
' Publicとして扱う
End Property
End Class
・具体例
' m_Val変数に対してのプロパティ設定
Class Test
Private m_Val As Long
Public Property Val As Long
Get
Return m_Val
End Get
Set(ByVal v As Long)
m_Val = v
End Set
End Property
End Class
・使用側
Sub TestSub()
Dim test As New Test
Dim val As Long
test.Val = 10
val = test.Val
End Sub
●プロパティのメリット
・使う側が意識しない
プロパティはクラスの中でメンバ変数に対しての処理を作成しますが、
クラスを使用する側はその処理を関数を呼び出していると意識することなく
通常のメンバ変数に対して代入や変更を行っているように使用できます。
・特性を持たせた処理ができる
GetとSetは取得、変更を行うための関数です。
この処理は基本的にプロパティのメンバ変数に対しての
取得、変更を行うものですが、ただ取得や変更を行うだけではなく
処理の内容を修正することも可能です。
例えばSetで設定する値のチェックを行うように処理を修正し、
バグの原因を排除することが可能です。
・バグ対策
メンバ変数を単純にPublic指定にすると
様々な箇所で簡単に変更加えることができてしまいます。
そうするとメンバ変数を使った処理で問題が発生した際に
どこで問題となる変更が行われたのか分かりづらくなります。
プロパティを設定することで、変更が行われる箇所が
Setの内部のみとなりますので、Setをチェックすれば
問題の値を設定している箇所の特定がしやすくなります。
■継承
継承とは既にあるクラスを元にして新しいクラスを作成できる機能のことです。
この機能を使用することで既にあるクラスの機能を持ち、
拡張が可能な別のクラスを作成することが可能となります。
●書式
・書式例
Class Parent
End Parent
Class Child
Inherits 親クラス名
End Class
・具体例
Class Parent
Public m_ParentVal As Long
End Parent
Class Child
Inherits Parent
End Child
・使用例
Sub Test()
Dim cls As New Child
cls.m_ParentVal = 100
End Sub
■コンストラクタ
コンストラクタとはクラスをインスタンス化する際に最初に呼び出される関数のことです。
コンストラクタの目的はメンバ変数の初期化となります。
クラスの汎用性を高めるためにコンストラクタに引数を設定することもでき、
その引数の値を使用して変数の初期化を行うことが可能です。
●書式
・書式例
Public Sub New (引数)
End Sub
・具体例
Class ConstractTest
Public Sub New(ByVal val As Long)
m_Val = val
End Sub
m_Val As Long
End Class
・使用例
Public Sub TestSub()
Dim ConstractTest test_class As New ConstractTest(100)
End Sub
■モジュールとクラスの違い
モジュールとクラスはともにシステムに必要な変数や関数をまとめるための機能です。
しかし、モジュールとクラスは以下の違いがあります。
●インスタンス化の必要の有無
クラスを使用するにはインスタンス化(Newによる作成)が必要ですが、
モジュールはインスタンス化する必要なくそのまま使用可能です。
この特性がモジュールとクラスのメリット、デメリットとなっています。
例:
Module Module1
Public Dim ModuleVal As Long
End Module
Class Class1
Public m_ClassVal As Long
End Class
Sub Test()
Module1.ModuleVal = 100
Dim cls As New Class1
cls.m_ClassVal = 1000
End Sub
●メリットとデメリット
・メリット
モジュール:
・インスタンス化の必要がない
・単一を保障されている
クラス:
・インスタンス化した数だけ同じ機能を持った
インスタンスを作成できる
・デメリット
モジュール:
・同じモジュールを複数作成できない
クラス:
・インスタンス化が必須
・単一ではない
上記のようにメリット、デメリットがあるのでクラスにするか、
モジュールにするかは作成する機能の内容の特性を踏まえて作成を行います。
●モジュールとクラスの注意
モジュールの中にクラスを定義することは可能ですが、
クラスの中にモジュールの定義を行うことはできませんので、注意して下さい。
問題例:
Class Class1
Module Module1
End Module
End Class
成功例:
Module Module1
Class Class1
End Class
End Module