クラス②(アクセス修飾子)【個人学習まとめ】
アクセス修飾子
クラス内のプロパティやメソッドのメンバーがどの範囲からアクセス可能か制御することができる。
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