プロパティの出力と入力を厳密に行うアクセサメソッド。前回では明示型の記述方法を描きました。入力用と出力用をメソッドがはっきり用意されているので、値を扱うクラスを作る際にはとても便利です。
ただ、明示型のアクセサメソッドはいかにもメソッドを使ってます!ってな感じな指定の仕方ですよね。前回のクラスで例えるとこんな感じ↓
student.setGPA( 値 );
普通のやり方ならば単純にプロパティに値を指定するだけになりますよね。
student._gpa = 値 ;
明示型アクセサメソッドのようにメソッドを使って値を入れるのも何ら問題はないですが、上記の単純な指定でやり取りすれば、実際にプロパティに値を指定している分、プロパティ値の流れがわかりやすくなります。
このアクセサメソッドでも厳密な指定をする際に、そういったシンプルな指定をしていみたい。そういう時に役に立つのが暗黙型アクセサメソッドです。
暗黙型アクセサメソッド
まずアクセサメソッドの明示と暗黙というのは、一体何に対してなのかという事ですが、これは「値の参照に対してメソッドを使っているかどうか」という事だと僕は解釈しています。明示型のアクセサメソッドは明らかにメソッドを使って値を扱っています。それに対して暗黙型アクセサメソッドは普通のプロパティの値指定とほとんど同じ記述になります。
Baseクラス
package {import flash.display.Sprite;
import flash.events.Event;
public class Base extends Sprite{
public function Base() {
addEventListener(Event.ADDED_TO_STAGE,init);
}
private function init(e:Event):void{
removeEventListener(Event.ADDED_TO_STAGE,init);
addOn();
}
private var student:GPA = new GPA();
private function addOn():void{trace("GPAオブジェクトのデフォルト値:"+student.gpa);
student.gpa = 4 ;//入力の処理
}
}
}
GPAクラス
package {
public class GPA {
public function GPA() {
// constructor code
}
private var _gpa:uint = 3;
public function get gpa():uint {
return _gpa;
}
public function set gpa(value:uint):void {
if (value>4) {
_gpa=4;
} else if (value < 0) {
_gpa=0;
} else {
_gpa=value;
}
trace("値は更新されました。現在の値は:"+_gpa);
}
}
}
上記が構成されているクラスの中身です。
Baseクラスの値の操作に注目して欲しいですが、プロパティの指定がとても普通な記述になってます。これが暗黙型の指定の仕方で、クラスを呼び出す方にはメソッドをプロパティのように扱う事が可能になります。(そういう風に見えます。)
GPAクラスはメソッドの記述を変更してあります。「get」「set」という記述を足してますね。呼び出す側には「gpa」の値で参照し、元クラスでは「_gpa」を操作しています。
これにより呼び出し側と呼び出し元のクラスそれぞれで違和感の無いプロパティの参照が可能になりますね。
実行結果はこちらです。
GPAオブジェクトのデフォルト値:3
値は更新されました。現在の値は:4

