カプセル化

 今まで作成したサンプルは、危険が潜んでいます。それは、スピードやガソリン残量を直接指定することができるという点です。急発進や、急停車、走行中にもかかわらず、ガソリン残量を変更できてしまいます。このままでは、完成されたオブジェクトとは言えません。

フィールドに自由にアクセスできる
フィールドに自由にアクセスできる

 そこで、オブジェクト指向の特徴のひとつである「カプセル化」を使用して、安全なクラスを作成しましょう。クラスを定義する際に、アクセス修飾子を指定することにより、カプセル化を行うことができます。アクセス修飾子は以下のような指定ができます。

アクセス修飾子 意味
Public クラスの内部・外部問わず、自由にアクセスすることができます。アクセス制限のレベルが最も低い修飾子です。
Protected クラスの内部と、派生したクラスからはアクセスすることができます。
Friend 同一プログラム内からであれば、自由にアクセスすることができます。
Protected Friend ProtectedとFriendを合わせたアクセス修飾子です。
Private クラスの内部からしかアクセスすることができません。アクセス制限のレベルが最も高い修飾子です。
アクセス修飾子一覧

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 CapsuleTest

サンプルダウンロード

○ 作成の準備

 「InstanceTest」プロジェクトを修正して作成しましょう。IntsantTestソリューションフォルダーのコピーを作り、フォルダー名をプロジェクト名に変更してください。コピーしてフォルダー名を変更したフォルダーからソリューションファイルを開いてVisual Studioを起動してください。起動するとプロジェクト名は変わっていませんが、複製を編集することになります。

○ プログラム

 Carクラスのフィールドを外部から直接操作できないようにしましょう。次のようにプログラムを変更してください。

Car.vb

  1. Public Class Car
  2.  'フィールド==========
  3.  'Public m_speed As Integer     'スピード情報
  4.  Private m_speed As Integer     'スピード情報(修正)
  5.  'Public m_gas As Double     'ガソリン情報
  6.  Private m_gas As Double     'ガソリン情報(修正)
  7.  'メソッド==========
  8.  '加速させるメソッド
  9.  Public Sub SpeedUp(ByVal sp As Integer)
  10.   Me.m_speed += sp
  11.   Me.m_gas -= sp / 10     '加速するとガソリンが減る
  12.  End Sub
  13.  '減速させるメソッド
  14.  Public Sub SpeedDown(sp As Integer)
  15.  Me.m_speed -= sp        '減速した場合はガソリンは消費しない
  16.   If Me.m_speed < 0 Then
  17.    Me.m_speed = 0
  18.   End If
  19.  End Sub
  20. End Class

カプセル化によりアクセスできなくなる
カプセル化によりアクセスできなくなる

 すると、このクラスを利用する記述の部分で変化が生じます。フィールドに値を代入したり、参照したりする記述ができなくなります。そのため、必要であればメソッドとして値を代入したり、参照したりする機能を追加しなくてはなりません。

○ プログラム

 次のようにCarクラスにメソッドを追加してください。

Car.vb

  1. Public Class Car
  2.  'フィールド==========
  3.  'Public m_speed As Integer     'スピード情報
  4.  Private m_speed As Integer     'スピード情報(修正)
  5.  'Public m_gas As Double     'ガソリン情報
  6.  Private m_gas As Double     'ガソリン情報(修正)
  7.  'メソッド==========
  8.  '加速させるメソッド
  9.  Public Sub SpeedUp(ByVal sp As Integer)
  10.   Me.m_speed += sp
  11.   Me.m_gas -= sp / 10     '加速するとガソリンが減る
  12.  End Sub
  13.  '減速させるメソッド
  14.  Public Sub SpeedDown(sp As Integer)
  15.  Me.m_speed -= sp        '減速した場合はガソリンは消費しない
  16.   If Me.m_speed < 0 Then
  17.    Me.m_speed = 0
  18.   End If
  19.  End Sub
  20.  '初期化を行うメソッド
  21.  Public Sub Init(gas As Double)
  22.   Me.m_speed = 0
  23.   Me.m_gas = gas
  24.  End Sub
  25.  'スピードを取得する
  26.  Public Function GetSpeed() As Integer
  27.   Return Me.m_speed
  28.  End Function
  29.  'ガソリン量を取得する
  30.  Public Function GetGas() As Double
  31.   Return Me.m_gas
  32.  End Function
  33. End Class

オブジェクトを生成して利用しているプログラムも修正しましょう。

Form1.vb

  1. '表示用プロシージャ
  2. Private Sub showData()
  3.  'Me.TextBox1.Text = Me.obj.m_speed()
  4.  Me.TextBox1.Text = Me.obj.getSpeed()
  5.  'Me.TextBox2.Text = Me.obj.m_gas()
  6.  Me.TextBox2.Text = Me.obj.getGas()
  7. End Sub
  8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.  'インスタンス生成
  10.  Me.obj = New Car()
  11.  'フィールド変数初期化
  12.  'Me.obj.m_speed = 0
  13.  'Me.obj.m_gas = 20
  14.  obj.init(20)
  15. End Sub

 カプセル化をすることにより、クラス作成者の意図に沿わない方法で使用されるのを避けることができますし、使用する側も特に意識することなく安全に、クラスを利用することができるようになります。

カプセル化したフィールドにアクセスするメソッドを用意
カプセル化したフィールドにアクセスするメソッドを用意

 一般的に、フィールドはPrivate指定で非公開にして、メソッドをPublicで公開にします。ただし、内部処理などで使うメソッドはPrivateにして、外部から利用されないようにします。

前へ   次へ