TypeScript / Хандалтын түвшин (public, private, protected)

Хандалтын түвшин (public, private, protected)

TypeScript классын property ба method-д хандалтын түвшин тавьж, гаднаас буруу ашиглахаас хамгаалах боломжтой. Энэ нь объект хандалтат програмчлалын (OOP) нэг үндэс суурь зарчим — encapsulation юм.

Гурван хандалтын түвшин

TypeScript-д гурван хандалтын түвшин байдаг:

typescript
class Жишээ {
  public нийтийн: string = "хүн бүр хандаж болно";
  private нууц: string = "зөвхөн энэ класс л хандана";
  protected хамгаалагдсан: string = "энэ класс ба хүүхэд класс хандана";
}

| Түвшин | Тухайн класс | Хүүхэд класс | Гадна | | ----------- | ------------ | ------------ | ----- | | public | ✅ | ✅ | ✅ | | protected | ✅ | ✅ | ❌ | | private | ✅ | ❌ | ❌ |

Зарим хэл зааж өгөхгүй бол private болдог. TypeScript-д заагаагүй бол public болдог тул тодорхой заах нь зөв дадал.

public — нийтийн хандалт

public property болон method-д хаанаас ч хандаж болно. Анхны утга нь public:

typescript
class Машин {
  public марк: string;
  public загвар: string;

  constructor(марк: string, загвар: string) {
    this.марк = марк;
    this.загвар = загвар;
  }

  public мэдээлэл(): string {
    return `${this.марк} ${this.загвар}`;
  }
}

const машин = new Машин("Toyota", "Prius");
console.log(машин.марк); // "Toyota" — гаднаас хандаж болно
console.log(машин.мэдээлэл()); // "Toyota Prius"

private — хувийн хандалт

private нь зөвхөн тухайн классын дотроос л хандаж болно. Дотоод хэрэгжилтийг нуухад хэрэглэнэ:

typescript
class Дансны_карт {
  public эзэн: string;
  private үлдэгдэл: number;
  private пин_код: string;

  constructor(эзэн: string, анхны_үлдэгдэл: number, пин: string) {
    this.эзэн = эзэн;
    this.үлдэгдэл = анхны_үлдэгдэл;
    this.пин_код = пин;
  }

  public мөнгө_авах(дүн: number, пин: string): boolean {
    if (пин !== this.пин_код) {
      console.log("Пин код буруу!");
      return false;
    }
    if (дүн > this.үлдэгдэл) {
      console.log("Үлдэгдэл хүрэлцэхгүй!");
      return false;
    }
    this.үлдэгдэл -= дүн;
    return true;
  }

  public үлдэгдэл_харах(пин: string): number | null {
    if (пин !== this.пин_код) return null;
    return this.үлдэгдэл;
  }
}

const карт = new Дансны_карт("Болд", 500_000, "1234");
карт.мөнгө_авах(100_000, "1234"); // true
// карт.үлдэгдэл;    // Алдаа: Property 'үлдэгдэл' is private
// карт.пин_код;     // Алдаа: Property 'пин_код' is private

private нь өгөгдлийг хамгаалж, зөвхөн зөвшөөрөгдсөн method-оор л хандах боломж олгодог.

protected — хамгаалагдсан хандалт

protected нь private-тай адил боловч хүүхэд класс мөн хандаж болно:

typescript
class Ажилтан {
  public нэр: string;
  protected цалин: number; // хүүхэд класс хандаж болно
  private нэвтрэх_нэр: string; // зөвхөн энэ класс

  constructor(нэр: string, цалин: number, нэвтрэх_нэр: string) {
    this.нэр = нэр;
    this.цалин = цалин;
    this.нэвтрэх_нэр = нэвтрэх_нэр;
  }
}

class Менежер extends Ажилтан {
  private хэлтэс: string;

  constructor(нэр: string, цалин: number, нэвтрэх_нэр: string, хэлтэс: string) {
    super(нэр, цалин, нэвтрэх_нэр);
    this.хэлтэс = хэлтэс;
  }

  урамшуулал_тооцоо(): number {
    return this.цалин * 0.1; // protected тул хандаж болно ✅
    // return this.нэвтрэх_нэр; // Алдаа: private тул хандаж болохгүй ❌
  }
}

const менежер = new Менежер("Дорж", 3_000_000, "dorj123", "Технологи");
console.log(менежер.нэр); // "Дорж" — public ✅
// менежер.цалин;                // Алдаа — protected, гаднаас хандаж болохгүй ❌
console.log(менежер.урамшуулал_тооцоо()); // 300_000

readonly — зөвхөн уншигдах

Хандалтын түвшнээс гадна readonly гэсэн өөрчилж болохгүй property байдаг:

typescript
class Бүтээгдэхүүн {
  readonly id: string;
  public нэр: string;

  constructor(id: string, нэр: string) {
    this.id = id;
    this.нэр = нэр;
  }

  нэр_өөрчлөх(шинэ_нэр: string): void {
    this.нэр = шинэ_нэр; // OK — public
    // this.id = "123";  // Алдаа: readonly property өөрчлөгдөхгүй
  }
}

const бүтээгдэхүүн = new Бүтээгдэхүүн("prod-001", "Гар утас");
бүтээгдэхүүн.нэр = "Зөөврийн компьютер"; // OK
// бүтээгдэхүүн.id = "prod-002";           // Алдаа!

Хандалтын түвшнийг зөв ашиглах нь кодыг найдвартай, аюулгүй болгодог. Гаднаас ямар property өөрчлөгдөж болохыг тодорхой зааж өгснөөр алдааг эртнээс сэргийлдэг.

Дараагийн хичээлд:

Generic — дахин ашиглагдах, олон төрлийн өгөгдлийг зохицуулж чадах кодыг хэрхэн бичихийг сурна.