JavaRush /Курсы /Модуль 2: Fullstack /Модификаторы доступа

Модификаторы доступа

Модуль 2: Fullstack
5 уровень , 5 лекция
Открыта

6.1 public (Публичный доступ)

Модификаторы доступа в TypeScript — это ключевые слова, которые позволяют контролировать видимость и доступность свойств и методов классов. Они помогают реализовать принцип инкапсуляции, обеспечивая контроль над тем, как данные внутри класса могут быть изменены или доступны извне.

В TypeScript используются три основных модификатора доступа: public, private и protected. Каждый из них мы сейчас рассмотрим подробно.

Модификатор publicмодификатор доступа по умолчанию для всех свойств и методов классов в TypeScript. Это означает, что, если модификатор доступа не указан явно, свойство или метод считается публичным. Публичные члены класса доступны из любой части программы.

Синтаксис:

JavaScript
    
      "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(); // Вызов публичного метода
    
  
TypeScript
    
      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 помогает защитить внутреннее состояние объекта от прямого доступа и изменений извне.

Синтаксис:

JavaScript
    
      "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'.
    
  
TypeScript
    
      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 ограничивает доступ к свойствам и методам классом и его подклассами. Это означает, что защищенные члены класса доступны внутри самого класса и всех его наследников, но недоступны вне этих классов.

Синтаксис:

JavaScript
    
      "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.
    
  
TypeScript
    
      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: Инкапсуляция данных пользователя

JavaScript
    
      "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'.
    
  
TypeScript
    
      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: Наследование и защищенные методы

JavaScript
    
      "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.
    
  
TypeScript
    
      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, но недоступны вне указанных классов.

Преимущества использования модификаторов доступа

  1. Инкапсуляция данных: модификаторы доступа помогают скрывать внутреннее состояние объекта и предоставлять только необходимые методы для работы с ним.
  2. Контроль доступа: они позволяют контролировать, какие части кода могут изменять или читать данные класса, что улучшает безопасность и надежность кода.
  3. Повышение читаемости: явное указание модификаторов доступа делает код более читаемым и понятным для других разработчиков, так как сразу видно, какие члены класса доступны извне, а какие — нет.
  4. Поддержка наследования: модификатор protected позволяет создавать защищенные члены, которые доступны в подклассах, обеспечивая гибкость в реализации наследования.
3
Задача
Модуль 2: Fullstack, 5 уровень, 5 лекция
Недоступна
Использование модификатора public
Использование модификатора public
3
Задача
Модуль 2: Fullstack, 5 уровень, 5 лекция
Недоступна
Использование модификатора private
Использование модификатора private
3
Задача
Модуль 2: Fullstack, 5 уровень, 5 лекция
Недоступна
Использование модификатора protected
Использование модификатора protected
3
Задача
Модуль 2: Fullstack, 5 уровень, 5 лекция
Недоступна
Инкапсуляция данных с private и public
Инкапсуляция данных с private и public
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ