クラス外部からのメンバーアクセス

アクセス修飾子はクラス外部のコードに対してのみ制限をかけます。クラス内部ではアクセスの隔離は発生しません

ここまでの学習で理解した通り、クラス内部からはすべてのメンバーに自由にアクセス可能です。

次に、クラス外部からメンバーへアクセスする方法を学びましょう。

クラス外部から公開インスタンスメンバーにアクセスするには「オブジェクト変数名.メンバー名」というドット構文を使用する必要があります。

class Program
{
    static void Main(string[] args)
    {
        Worker worker = new Worker(); //オブジェクトを作成
        int hours = worker.GetHours(); //オブジェクト経由でpublicメソッドを呼び出す
        worker.hours = 12; //オブジェクトからpublic変数に値を代入
        Console.WriteLine(worker.hours); //普通の変数と同じように値を参照
    }
}

class Worker
{
    int age;
    private double savings;
    public int hours;

    void ReadSavings()
    {
        Console.WriteLine(savings);
    }

    public int GetHours()
    {
        return hours;
    }
}Code language: C# (cs)

Worker のメソッド GetHours には public が指定されているため、外部から読み書きできます。

Program クラスの Main メソッドで Worker 型オブジェクト worker を生成しています。

オブジェクト名 worker を通じてアクセスします。オブジェクト名はポインタのような役割で参照(メモリアドレス)を保持し、ドット . と組み合わせることで公開メンバーにアクセスできます。

外部からインスタンスメンバーにアクセスする書式:オブジェクト変数.公開フィールド/公開メソッド()

private メンバーはクラス外部からドット構文でアクセスできません

クラス外部からプライベートメンバー(フィールド・関数)にアクセスしようとすると、コンパイルエラーが発生します。

エラーとなる例

class Program
{
    static void Main(string[] args)
    {
        Worker worker = new Worker(); 
        int hours = worker.GetHours(); 
        worker.hours = 12;
        Console.WriteLine(worker.hours);

        worker.ReadSavings();
        worker.age = 20;
        worker.savings = 1000000000.0;
    }
}

class Worker
{
    int age;
    private double savings;
    public int hours;

    void ReadSavings()
    {
        Console.WriteLine(savings);
    }

    public int GetHours()
    {
        return hours;
    }
}Code language: C# (cs)

別の例を見てみましょう

class Rectangle
{
    // 公開インスタンスフィールド:縦 Length、横 Width
    public int Length, Width;

    // インスタンスメソッド:矩形の面積を計算して返す
    public int GetArea()
    {
        return Length * Width;
    }
}

class Program
{
    static void Main()
    {
        // 独立した矩形インスタンスを2つ作成
        Rectangle rect1 = new Rectangle();
        Rectangle rect2 = new Rectangle();

        // それぞれ長さを設定、データは相互に隔離される
        rect1.Length = 10; rect1.Width = 5;
        rect2.Length = 8;  rect2.Width = 7;

        // 値を参照し、メソッド実行で面積を出力
        Console.WriteLine("矩形1:縦{0},横{1},面積{2}", rect1.Length, rect1.Width, rect1.GetArea());
        Console.WriteLine("矩形2:縦{0},横{1},面積{2}", rect2.Length, rect2.Width, rect2.GetArea());
    }
}Code language: C# (cs)

こちらは矩形のクラスです。Length と Width という2つの公開フィールドに長辺・短辺の値を保持し、GetArea メソッドで面積を算出します。

これらのメンバーはすべて公開状態です。

実行結果

矩形1:縦10,横5,面積50
矩形2:縦8,横7,面積56

メモリ上の保持構造はこちら

2つのオブジェクトは独立して確保され、それぞれ固有の Length と Width を持ち、互いに影響を与えません。

クラス外部からのメンバーアクセス

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です