フィールドは原則 private にして隠蔽することが推奨されますが、それでもどうしても外部からフィールドにアクセスしたい場合があります。
その場合は「getter」と「setter」というテクニックが使われます。
なお getter と setter はカプセル化を崩してしまうので使っていけないと主張する人も多いですが、デバッグの際にトレースしやすくなるというメリットもあり、実際のところ良く使われています。
※ もちろん必要以上に getter と setter を使わないことに越したことはありません。
さて、getter は隠蔽されたフィールドの値を外部から取得するために使うメソッドで、例えば Java ではソース 1 の様に定義します。
public class HOGE{
private int abc = 123; // abc は private なので外部から参照できない!
// フィールド abc の getter を用意して値を取得出来るようにする
// メソッド名は何でも良いが「getフィールド名」とする人が多いかも
public int get_abc(){ return this.abc; }
}
さてHOGE クラス以外のクラスから abc フィールドの値を取得したい場合はソース 2 のようにします。
・他のクラスから使う場合
public class Main{
public static void main(String[] args) {
HOGE hoge = new HOGE();
// abc には直接アクセス出来ないので getter を経由して値を取得する
System.out.println( hoge.get_abc() );
}
}
・HOGE を継承したクラス内で使う場合
public class FUGA extends HOGE {
public void hoge(){
// HOGE を継承したクラスでも abc には直接アクセス出来ないので
// やはり getter を経由して値を取得する
System.out.println( this.get_abc() );
}
}
一方 setter は隠蔽されたフィールドの値を外部から変更するために使うメソッドで、例えば Java ではソース 3 の様に書きます。
public class HOGE{
private int abc = 123; // abc は private なので外部から変更できない
// フィールド abc の setter
// メソッド名は何でも良いが「setフィールド名」とする人が多いかも
public void set_abc( int a ){ this.abc = a; }
// getter
public int get_abc(){ return this.abc; }
}
それで HOGE クラス以外のクラスから abc フィールドに値をセットしたい場合はソース 4 のようにします。
・他のクラスから使う場合
public class Main{
public static void main(String[] args) {
HOGE hoge = new HOGE();
System.out.println( hoge.get_abc() );
// abc には直接アクセス出来ないので setter を経由して値を変更する
hoge.set_abc( 456 );
System.out.println( hoge.get_abc() );
}
}
・HOGE を継承したクラス内で使う場合
public class FUGA extends HOGE {
public void hoge(){
System.out.println( this.get_abc() );
// HOGE を継承したクラスでも abc には直接アクセス出来ないので
// やはり setter を経由して値を変更する
this.set_abc( 456 );
System.out.println( this.get_abc() );
}
}
なお getter と setter の代わりにプロパティという機能をもつ言語もあります。
プロパティは最近のオブジェクト指向プログラミングでは必須の機能ですので、詳しくは自分で調べておきましょう。
参考までに C# ではプロパティはソース 5 の様にして使います。
HOGE.cs の内容:
class HOGE
{
public int abc{ get; set; } = 123; // abc プロパティの定義
}
MyMain.cs の内容:
using System;
class MyMain
{
static void Main(string[] args){
var hoge = new HOGE();
Console.WriteLine( hoge.abc );
hoge.abc = 321;
Console.WriteLine( hoge.abc );
}
}
実行:
$ mcs MyMain.cs HOGE.cs
$ mono MyMain.exe
123
321