クラス

■概要

クラスは特定の機能を実行するために必要な関数や変数をまとめることができる機能のことです。
クラスを使用することによりオブジェクト単位でプログラムを考えることができるようになるので、
オブジェクト指向型のプログラミングが可能となります。

■宣言と使用

●宣言
	書式例:
		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