👀

クラス②(アクセス修飾子)【個人学習まとめ】

2024/12/27に公開

アクセス修飾子

クラス内のプロパティやメソッドのメンバーがどの範囲からアクセス可能か制御することができる。

public

public修飾子を持つメンバー(プロパティ、メソッド)はクラスの内側、外側問わずにアクセス可能。
アクセス修飾子を指定していなければ、常にpublicになる。

class PersonClass {
  public name: string; //明示的に指定
  age: number; //デフォルトでpublic

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  public greet() {
    console.log(
      //PersonClass内で name と age にアクセス
      `こんにちは! 私の名前は ${this.name} です。年齢は ${this.age}です!`
    );
  }
}

PersonClassの外側からアクセスする場合。

const taro = new PersonClass("太郎", 20); //taroというインスタンス(実体)を生成。

//PersonClassの外側からアクセス
console.log(taro.name);
→太郎
console.log(taro.age);20
taro.greet();
→こんにちは! 私の名前は 太郎 です。年齢は 20です!

private

private修飾子を持つメンバーはクラス内部のみアクセス可能。
次の例ではprivate修飾子をもつcountryプロパティをPersonClassに追加。
さらに、publicプロパティをもつintroduceMyCountryメソッドを追加。

class PersonClass {
  public name: string;
  age: number;
+  private country: string;

  constructor(name: string, age: number, address: string) {
    this.name = name;
    this.age = age;
+    this.country = address;
  }

  public greet() {
    console.log(
      `こんにちは! 私の名前は ${this.name} です。年齢は ${this.age}です!`
    );
  }

+  public introduceMyCountry() {
+    //PersonClass内で address にアクセス可能。
+    console.log(`出身国は ${this.country} です!`);
+  }
}

PersonClassの外側からcountryにアクセスしようとするとエラーになる。

const taro = new PersonClass("太郎", 20, "日本"); //taroというインスタンス(実体)を生成。

//PersonClassの外側からはアクセスできない。
+ console.log(taro.country); //プロパティ 'country' はプライベートで、クラス 'PersonClass' 内でのみアクセスできます。ts(2341)

しかし、public修飾子を持つintroduceMyCountryメソッドを経由することによってcountryプロパティに間接的にアクセスすることができる。

taro.introduceMyCountry()
→出身国は 日本 です!

private修飾子を使うことによって、データをカプセル化することができる。

protected

protected修飾子をもつメンバーは、クラス内とサブクラス内からアクセス可能。
これによって、外部からアクセスすることはできないがサブクラスのメソッドからアクセスすることはできる。
次の例ではprotected修飾子をもつoldPositionプロパティをPersonClass`に追加。

class PersonClass {
    public name: string;
    age: number;
    private country: string;
+    protected oldPosition: string;

    constructor(name: string, age: number, address: string, oldPosition: string) {
        this.name = name;
        this.age = age;
        this.country = address;
+        this.oldPosition = oldPosition;
    }

    public greet() {
        console.log(
            `こんにちは! 私の名前は ${this.name} です。年齢は ${this.age}です!`
        );
    }

    public introduceMyCountry() {
        //PersonClass内で address にアクセス可能。
        console.log(`出身国は ${this.country} です!`);
    }
}

TeacherClassを追加。
このTeacherClassは、PersonClassのサブクラスである。そのため、intorduceMyPositionメソッドでは、protectedに設定されたoldPositionにアクセスできる。
しかし、kyoto.intorduceMyPosition();としてoldPositionにちょくせすアクセスすることはできない。

proteced修飾子を使うことによって、カプセル化を強化しクラスの内部実装を隠すことができる。

Discussion