カプセル化
今まで作成したサンプルは、危険が潜んでいます。それは、スピードやガソリン残量を直接指定することができるという点です。急発進や、急停車、走行中にもかかわらず、ガソリン残量を変更できてしまいます。このままでは、完成されたオブジェクトとは言えません。
フィールドに自由にアクセスできる
そこで、オブジェクト指向の特徴のひとつである「カプセル化」を使用して、安全なクラスを作成しましょう。クラスを定義する際に、アクセス修飾子を指定することにより、カプセル化を行うことができます。アクセス修飾子は以下のような指定ができます。
アクセス修飾子
|
意味
|
Public
|
クラスの内部・外部問わず、自由にアクセスすることができます。アクセス制限のレベルが最も低い修飾子です。
|
Protected
|
クラスの内部と、派生したクラスからはアクセスすることができます。
|
Friend
|
同一プログラム内からであれば、自由にアクセスすることができます。
|
Protected Friend
|
ProtectedとFriendを合わせたアクセス修飾子です。
|
Private
|
クラスの内部からしかアクセスすることができません。アクセス制限のレベルが最も高い修飾子です。
|
アクセス修飾子一覧
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 |
コンソール アプリケーション |
プロジェクト名 |
CapsuleTest |
サンプルダウンロード
○ 作成の準備
「InstanceTest」プロジェクトを修正して作成しましょう。IntsantTestソリューションフォルダーのコピーを作り、フォルダー名をプロジェクト名に変更してください。コピーしてフォルダー名を変更したフォルダーからソリューションファイルを開いてVisual Studioを起動してください。起動するとプロジェクト名は変わっていませんが、複製を編集することになります。
○ プログラム
Carクラスのフィールドを外部から直接操作できないようにしましょう。次のようにプログラムを変更してください。
Car.vb
- Public Class Car
- 'フィールド==========
- 'Public m_speed As Integer 'スピード情報
- Private m_speed As Integer 'スピード情報(修正)
- 'Public m_gas As Double 'ガソリン情報
- Private m_gas As Double 'ガソリン情報(修正)
- 'メソッド==========
- '加速させるメソッド
- Public Sub SpeedUp(ByVal sp As Integer)
- Me.m_speed += sp
- Me.m_gas -= sp / 10 '加速するとガソリンが減る
- End Sub
- '減速させるメソッド
- Public Sub SpeedDown(sp As Integer)
- Me.m_speed -= sp '減速した場合はガソリンは消費しない
- If Me.m_speed < 0 Then
- Me.m_speed = 0
- End If
- End Sub
- End Class
カプセル化によりアクセスできなくなる
すると、このクラスを利用する記述の部分で変化が生じます。フィールドに値を代入したり、参照したりする記述ができなくなります。そのため、必要であればメソッドとして値を代入したり、参照したりする機能を追加しなくてはなりません。
○ プログラム
次のようにCarクラスにメソッドを追加してください。
Car.vb
- Public Class Car
- 'フィールド==========
- 'Public m_speed As Integer 'スピード情報
- Private m_speed As Integer 'スピード情報(修正)
- 'Public m_gas As Double 'ガソリン情報
- Private m_gas As Double 'ガソリン情報(修正)
- 'メソッド==========
- '加速させるメソッド
- Public Sub SpeedUp(ByVal sp As Integer)
- Me.m_speed += sp
- Me.m_gas -= sp / 10 '加速するとガソリンが減る
- End Sub
- '減速させるメソッド
- Public Sub SpeedDown(sp As Integer)
- Me.m_speed -= sp '減速した場合はガソリンは消費しない
- If Me.m_speed < 0 Then
- Me.m_speed = 0
- End If
- End Sub
- '初期化を行うメソッド
- Public Sub Init(gas As Double)
- Me.m_speed = 0
- Me.m_gas = gas
- End Sub
- 'スピードを取得する
- Public Function GetSpeed() As Integer
- Return Me.m_speed
- End Function
- 'ガソリン量を取得する
- Public Function GetGas() As Double
- Return Me.m_gas
- End Function
- End Class
オブジェクトを生成して利用しているプログラムも修正しましょう。
Form1.vb
- '表示用プロシージャ
- Private Sub showData()
- 'Me.TextBox1.Text = Me.obj.m_speed()
- Me.TextBox1.Text = Me.obj.getSpeed()
- 'Me.TextBox2.Text = Me.obj.m_gas()
- Me.TextBox2.Text = Me.obj.getGas()
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 'インスタンス生成
- Me.obj = New Car()
- 'フィールド変数初期化
- 'Me.obj.m_speed = 0
- 'Me.obj.m_gas = 20
- obj.init(20)
- End Sub
カプセル化をすることにより、クラス作成者の意図に沿わない方法で使用されるのを避けることができますし、使用する側も特に意識することなく安全に、クラスを利用することができるようになります。
カプセル化したフィールドにアクセスするメソッドを用意
一般的に、フィールドはPrivate指定で非公開にして、メソッドをPublicで公開にします。ただし、内部処理などで使うメソッドはPrivateにして、外部から利用されないようにします。
前へ 次へ