クラスを更に考える (5/8)
作成:2011-02-09 09:07
更新:2011-02-09 09:07
更新:2011-02-09 09:07
■インスタンス変数のアクセス権について
ここまで、簡単なクラスを作成してきましたが、実際に作ってみて感じるのは「インスタンス変数の利用の面倒くささ」ではないでしょうか。クラス内のメソッドからは、インスタンス変数は自由に利用できます。が、インスタンスを作って、外部からそのインスタンスの中のインスタンス変数を利用するためには、メソッドの助けを借りなければいけません。
このため、インスタンス変数の値を取り出したり変更したりするためのメソッドを用意していました。1つのインスタンス変数につき2つのメソッドが必要になるわけです。5つあれば、計10個のメソッドを用意しないといけません。正直、面倒ですね。インスタンス変数の設定にいろいろと制約などがあるなら仕方がありませんが、ただ単に値を設定したり取り出すだけでいいなら、直接インスタンス変数を外部から利用できたほうがはるかに楽です。
なぜ、外部からインスタンス変数が使えなかったのか。これはいくつか要因はありますが、もっとも大きな要因は「アクセス権がない」ためです。インスタンス変数は、デフォルトでは外部から利用できないよう隠蔽されているのです。直接、外部から変数の値を書き換えられたりするとプログラムに支障が出ることもありますので、触れないようになっているのです。
が、「別に自由に外部から利用できても問題ない」ということもあるでしょう。こうした場合は、インスタンス変数にアクセス権を設定することで、外部からのアクセスを可能にすることができます。――Objective-Cには、アクセス権に関する「コンパイラディレクティブ」というものが用意されていて、これを使うことでインスタンス変数のアクセス権を設定できるのです。用意されているコンパイラディレクティブには以下のようなものがあります。
@private
外部からは完全に隠蔽され、利用できません。クラス内だけで利用する場合は、これを指定します。
@protected
このクラスおよびサブクラス内でのみ利用することができます。デフォルトでは、これが設定されています。
@public
外部に公開され、自由に利用することができます。もっとも制約のない形です。
これらのコンパイラディレクティブは、インスタンス変数を記述するところに用意します。これらを記述すると、それより下に書かれた変数はすべて指定のアクセス権に設定されます。ざっとこんな形で書くわけですね。
何もコンパイラディレクティブを指定しない場合は、@protectedと同じになりますから、わざわざ@protectedは書かないかも知れません。これらは、全部各必要はありません。必要なものだけでOKです。
このため、インスタンス変数の値を取り出したり変更したりするためのメソッドを用意していました。1つのインスタンス変数につき2つのメソッドが必要になるわけです。5つあれば、計10個のメソッドを用意しないといけません。正直、面倒ですね。インスタンス変数の設定にいろいろと制約などがあるなら仕方がありませんが、ただ単に値を設定したり取り出すだけでいいなら、直接インスタンス変数を外部から利用できたほうがはるかに楽です。
なぜ、外部からインスタンス変数が使えなかったのか。これはいくつか要因はありますが、もっとも大きな要因は「アクセス権がない」ためです。インスタンス変数は、デフォルトでは外部から利用できないよう隠蔽されているのです。直接、外部から変数の値を書き換えられたりするとプログラムに支障が出ることもありますので、触れないようになっているのです。
が、「別に自由に外部から利用できても問題ない」ということもあるでしょう。こうした場合は、インスタンス変数にアクセス権を設定することで、外部からのアクセスを可能にすることができます。――Objective-Cには、アクセス権に関する「コンパイラディレクティブ」というものが用意されていて、これを使うことでインスタンス変数のアクセス権を設定できるのです。用意されているコンパイラディレクティブには以下のようなものがあります。
@private
外部からは完全に隠蔽され、利用できません。クラス内だけで利用する場合は、これを指定します。
@protected
このクラスおよびサブクラス内でのみ利用することができます。デフォルトでは、これが設定されています。
@public
外部に公開され、自由に利用することができます。もっとも制約のない形です。
これらのコンパイラディレクティブは、インスタンス変数を記述するところに用意します。これらを記述すると、それより下に書かれた変数はすべて指定のアクセス権に設定されます。ざっとこんな形で書くわけですね。
@interface クラス {
@public
……publicにする変数の宣言……
@protected
……protectedにする変数の宣言……
@private
……privateにする変数の宣言……
}
何もコンパイラディレクティブを指定しない場合は、@protectedと同じになりますから、わざわざ@protectedは書かないかも知れません。これらは、全部各必要はありません。必要なものだけでOKです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る