آموزش جامع کلاس‌ها و اینترفیس‌ها در TypeScript


🎯 اهداف یادگیری

  • آشنایی با مفاهیم کلاس و اینترفیس در TypeScript
  • یادگیری نحوه تعریف و استفاده از کلاس‌ها
  • درک تفاوت‌های بین اینترفیس و نوع (type)
  • کاربرد اینترفیس‌ها در پیاده‌سازی الگوهای طراحی

📌 مقدمه‌ای بر کلاس‌ها در TypeScript

کلاس‌ها بلوک‌های ساختمانی برنامه‌های شیءگرا هستند که امکان کپسوله‌سازی، وراثت و چندشکلی را فراهم می‌کنند:

typescript
class Person {
firstName: string;
lastName: string;
age: number;
constructor(firstName: string, lastName: string, age: number) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
getFullName(): string {
return `${this.firstName} ${this.lastName}`;
}
}
const person = new Person('علی', 'محمدی', 30);
console.log(person.getFullName()); // خروجی: علی محمدی

ویژگی‌های کلاس‌ها در TypeScript:

  • اعضای کلاس: خصوصیات (properties) و متدها (methods)
  • مشخصات نوع (Type Annotations): تعیین نوع برای خصوصیات و پارامترها
  • سازنده (Constructor): تابع ویژه برای مقداردهی اولیه

📌 سطح دسترسی در کلاس‌ها

TypeScript از سه سطح دسترسی پشتیبانی می‌کند:

typescript
class BankAccount {
public accountNumber: string; // قابل دسترسی از همه جا
private balance: number; // فقط درون کلاس
protected owner: string; // درون کلاس و کلاس‌های فرزند
constructor(accountNumber: string, initialBalance: number, owner: string) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
this.owner = owner;
}
public deposit(amount: number): void {
this.balance += amount;
}
public getBalance(): number {
return this.balance;
}
}

قوانین سطح دسترسی:

  • public: پیش‌فرض - قابل دسترسی از هرجای برنامه
  • private: فقط درون خود کلاس قابل دسترسی است
  • protected: درون کلاس و کلاس‌های مشتق شده قابل دسترسی است

📌 وراثت و کلاس‌های مشتق شده

TypeScript از وراثت کلاس‌ها با کلمه کلیدی extends پشتیبانی می‌کند:

typescript
class Animal {
constructor(public name: string) {}
move(distance: number = 0) {
console.log(`${this.name} moved ${distance}m.`);
}
}
class Dog extends Animal {
constructor(name: string) {
super(name); // فراخوانی سازنده کلاس والد
}
bark() {
console.log('Woof! Woof!');
}
move(distance: number = 5) {
// بازنویسی متد move از کلاس والد
console.log('Running...');
super.move(distance);
}
}
const dog = new Dog('Rex');
dog.bark(); // خروجی: Woof! Woof!
dog.move(); // خروجی: Running... Rex moved 5m.

مفاهیم کلیدی وراثت:

  • extends: برای ایجاد رابطه وراثت بین کلاس‌ها
  • super: برای دسترسی به اعضای کلاس والد
  • بازنویسی متد (Method Overriding): تغییر رفتار متدهای ارث‌بری شده

📌 اینترفیس‌ها در TypeScript

اینترفیس‌ها قراردادهایی هستند که ساختار شیء را تعریف می‌کنند:

typescript
interface User {
id: number;
username: string;
email?: string; // پارامتر اختیاری
register(): string;
}
class Member implements User {
id: number;
username: string;
constructor(id: number, username: string) {
this.id = id;
this.username = username;
}
register(): string {
return `${this.username} ثبت نام کرد`;
}
}
const member = new Member(1, 'user123');
console.log(member.register()); // خروجی: user123 ثبت نام کرد

ویژگی‌های اینترفیس‌ها:

  • تعریف ساختار: مشخص می‌کند یک شیء باید چه ویژگی‌هایی داشته باشد
  • پیاده‌سازی با implements: کلاس‌ها می‌توانند اینترفیس‌ها را پیاده‌سازی کنند
  • پارامترهای اختیاری: با علامت سؤال (?) مشخص می‌شوند

📌 تفاوت اینترفیس و نوع (type)

اینترفیس نوع (type)
برای تعریف شکل شیء استفاده می‌شود برای تعریف انواع دلخواه (union, intersection, ...)
قابل توسعه است (با extends) غیرقابل گسترش است
برای پیاده‌سازی کلاس‌ها مناسب است برای ترکیب انواع مختلف مناسب است

📌 تمرین عملی

اینترفیس و کلاس زیر را کامل کنید:

typescript
interface Vehicle {
// ویژگی‌های مورد نیاز را اضافه کنید
// حداقل دو متد تعریف کنید
}
class Car implements Vehicle {
// پیاده‌سازی اینترفیس Vehicle
// یک متد اضافه برای کلاس Car بنویسید
}

راهنمای تمرین:

  1. ویژگی‌های اساسی یک وسیله نقلیه را در اینترفیس تعریف کنید
  2. متدهای start و stop را اضافه کنید
  3. کلاس Car را پیاده‌سازی کنید
  4. متد honk را به کلاس Car اضافه کنید

📌 قدم بعدی

در درس بعدی با ساخت لیست کارها با جاوااسکریپت آشنا خواهیم شد!