フィールドは原則 private にして隠蔽することが推奨されますが、それでもどうしても外部からフィールドにアクセスしたい場合があります。
その場合は「getter」と「setter」というテクニックがよく使われています。
※ getter と setter を使うとカプセル化が崩れてしまうので使っていけないと主張する人も多いです
getter は隠蔽されたフィールドの値を外部から取得するために使うメソッドで、例えば Java ではソース 1 の様に定義します。
public class HOGE{
private int abc; // abc は private なので外部から参照できない
// フィールド abc の getter
// メソッド名は何でも良いが「getフィールド名」とする人が多いかも
public int get_abc(){ return abc; }
}
さてHOGE クラス以外のクラスから abc フィールドの値を取得したい場合はソース 2 のようにします。
・HOGE を継承していないクラスの場合 HOGE hoge = new HOGE(); int a = hoge.get_abc(); ・HOGE を継承したクラスの場合 int a = get_abc(); または int a = this.get_abc();
一方 setter は隠蔽されたフィールドの値を外部から変更するために使うメソッドで、例えば Java ではソース 3 の様に書きます。
public class HOGE{
private int abc; // abc は private なので外部から変更できない
// フィールド abc の setter
// メソッド名は何でも良いが「setフィールド名」とする人が多いかも
public void set_abc( int a ){ abc = a; }
}
それで HOGE クラス以外のクラスから abc フィールドに値をセットしたい場合はソース 4 のようにします。
・HOGE を継承していないクラスの場合 HOGE hoge = new HOGE(); hoge.set_abc( 123 ); ・HOGE を継承しているクラスの場合 set_abc( 123 ); または this.set_abc( 123 );
なお 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