6.1 public (Публичный доступ)
Модификаторы доступа в TypeScript — это ключевые слова, которые позволяют контролировать видимость и доступность свойств и методов классов. Они помогают реализовать принцип инкапсуляции, обеспечивая контроль над тем, как данные внутри класса могут быть изменены или доступны извне.
В TypeScript используются три основных модификатора доступа: public, private и protected. Каждый из них мы сейчас рассмотрим подробно.
Модификатор public — модификатор доступа по умолчанию для всех свойств и методов классов в TypeScript. Это означает, что, если модификатор доступа не указан явно, свойство или метод считается публичным. Публичные члены класса доступны из любой части программы.
Синтаксис:
"use strict";
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person = new Person('Alice', 30);
console.log(person.name); // Доступ к публичному свойству
person.greet(); // Вызов публичного метода
class Person {
public name: string;
public age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public greet(): void {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person = new Person('Alice', 30);
console.log(person.name); // Доступ к публичному свойству
person.greet(); // Вызов публичного метода
В этом примере свойства name и age, а также метод greet объявлены с модификатором public, что делает их доступными вне класса.
6.2 private (Приватный доступ)
Модификатор private ограничивает доступ к свойствам и методам только внутри самого класса. Это означает, что приватные члены класса не могут быть доступны или изменены вне класса. Использование private помогает защитить внутреннее состояние объекта от прямого доступа и изменений извне.
Синтаксис:
"use strict";
class BankAccount {
constructor(initialBalance) {
this.balance = initialBalance;
}
deposit(amount) {
this.balance += amount;
}
withdraw(amount) {
if (amount <= this.balance) {
this.balance -= amount;
}
else {
console.log('Insufficient funds');
}
}
getBalance() {
return this.balance;
}
}
let account = new BankAccount(1000);
account.deposit(500);
account.withdraw(300);
console.log(account.getBalance()); // Доступ к приватному свойству через публичный метод
// console.log(account.balance); // Ошибка компиляции: Property 'balance' is private and only accessible within class 'BankAccount'.
class BankAccount {
private balance: number;
constructor(initialBalance: number) {
this.balance = initialBalance;
}
public deposit(amount: number): void {
this.balance += amount;
}
public withdraw(amount: number): void {
if (amount <= this.balance) {
this.balance -= amount;
} else {
console.log('Insufficient funds');
}
}
public getBalance(): number {
return this.balance;
}
}
let account = new BankAccount(1000);
account.deposit(500);
account.withdraw(300);
console.log(account.getBalance()); // Доступ к приватному свойству через публичный метод
// console.log(account.balance); // Ошибка компиляции: Property 'balance' is private and only accessible within class 'BankAccount'.
В этом примере свойство balance объявлено с модификатором private, поэтому оно недоступно вне класса BankAccount. Доступ к балансу возможен только через публичные методы deposit, withdraw и getBalance.
6.3 protected (Защищенный доступ)
Модификатор protected ограничивает доступ к свойствам и методам классом и его подклассами. Это означает, что защищенные члены класса доступны внутри самого класса и всех его наследников, но недоступны вне этих классов.
Синтаксис:
"use strict";
class Employee {
constructor(name) {
this.name = name;
}
display() {
console.log(`Employee Name: ${this.name}`);
}
}
class Manager extends Employee {
constructor(name, department) {
super(name);
this.department = department;
}
showDetails() {
this.display(); // Вызов защищенного метода родительского класса
console.log(`Department: ${this.department}`);
}
}
let manager = new Manager('Bob', 'Sales');
manager.showDetails(); // Доступ к защищенному методу через публичный метод подкласса
// manager.display(); // Ошибка компиляции: Property 'display' is protected and only accessible within class 'Employee' and its subclasses.
class Employee {
protected name: string;
constructor(name: string) {
this.name = name;
}
protected display(): void {
console.log(`Employee Name: ${this.name}`);
}
}
class Manager extends Employee {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public showDetails(): void {
this.display(); // Вызов защищенного метода родительского класса
console.log(`Department: ${this.department}`);
}
}
let manager = new Manager('Bob', 'Sales');
manager.showDetails(); // Доступ к защищенному методу через публичный метод подкласса
// manager.display(); // Ошибка компиляции: Property 'display' is protected and only accessible within class 'Employee' and its subclasses.
В этом примере свойство name и метод display объявлены с модификатором protected в классе Employee. Эти члены доступны в подклассе Manager, но недоступны вне указанных классов.
6.4 Примеры
Модификаторы доступа широко используются в реальных проектах для инкапсуляции и контроля доступа к данным и методам классов. Рассмотрим несколько примеров.
Пример 1: Инкапсуляция данных пользователя
"use strict";
class User {
constructor(id, password) {
this.id = id;
this.password = password;
}
getId() {
return this.id;
}
validatePassword(inputPassword) {
return this.password === inputPassword;
}
}
let user = new User(1, 'secret123');
console.log(user.getId()); // Доступ к приватному свойству через публичный метод
console.log(user.validatePassword('secret123')); // Проверка пароля
// console.log(user.password); // Ошибка компиляции: Property 'password' is private and only accessible within class 'User'.
class User {
private id: number;
private password: string;
constructor(id: number, password: string) {
this.id = id;
this.password = password;
}
public getId(): number {
return this.id;
}
public validatePassword(inputPassword: string): boolean {
return this.password === inputPassword;
}
}
let user = new User(1, 'secret123');
console.log(user.getId()); // Доступ к приватному свойству через публичный метод
console.log(user.validatePassword('secret123')); // Проверка пароля
// console.log(user.password); // Ошибка компиляции: Property 'password' is private and only accessible within class 'User'.
Здесь свойства id и password объявлены с модификатором private, что защищает их от прямого доступа. Методы getId и validatePassword предоставляют контролируемый доступ к этим данным.
Пример 2: Наследование и защищенные методы
"use strict";
class Animal {
constructor(species) {
this.species = species;
}
sound() {
console.log('Some generic animal sound');
}
}
class Dog extends Animal {
constructor() {
super('Dog');
}
bark() {
this.sound(); // Вызов защищенного метода родительского класса
console.log('Woof! Woof!');
}
}
let dog = new Dog();
dog.bark(); // Доступ к защищенному методу через публичный метод подкласса
// dog.sound(); // Ошибка компиляции: Property 'sound' is protected and only accessible within class 'Animal' and its subclasses.
class Animal {
protected species: string;
constructor(species: string) {
this.species = species;
}
protected sound(): void {
console.log('Some generic animal sound');
}
}
class Dog extends Animal {
constructor() {
super('Dog');
}
public bark(): void {
this.sound(); // Вызов защищенного метода родительского класса
console.log('Woof! Woof!');
}
}
let dog = new Dog();
dog.bark(); // Доступ к защищенному методу через публичный метод подкласса
// dog.sound(); // Ошибка компиляции: Property 'sound' is protected and only accessible within class 'Animal' and its subclasses.
Здесь свойство species и метод sound объявлены с модификатором protected в классе Animal. Эти члены доступны в подклассе Dog, но недоступны вне указанных классов.
Преимущества использования модификаторов доступа
- Инкапсуляция данных: модификаторы доступа помогают скрывать внутреннее состояние объекта и предоставлять только необходимые методы для работы с ним.
- Контроль доступа: они позволяют контролировать, какие части кода могут изменять или читать данные класса, что улучшает безопасность и надежность кода.
- Повышение читаемости: явное указание модификаторов доступа делает код более читаемым и понятным для других разработчиков, так как сразу видно, какие члены класса доступны извне, а какие — нет.
- Поддержка наследования: модификатор
protectedпозволяет создавать защищенные члены, которые доступны в подклассах, обеспечивая гибкость в реализации наследования.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ