TypeScript là một ngôn ngữ lập trình mạnh mẽ, hỗ trợ lập trình hướng đối tượng (OOP) với nhiều tính năng giúp lập trình viên xây dựng các ứng dụng phức tạp. Trong bài viết này, chúng ta sẽ khám phá những thuật ngữ chính trong lập trình hướng đối tượng mà TypeScript hỗ trợ.

1. Lớp (Class)

Lớp là một trong những khái niệm cơ bản của lập trình hướng đối tượng. Nó đại diện cho một kiểu dữ liệu mới, bao gồm các thuộc tính (properties) và phương thức (methods). TypeScript cho phép bạn định nghĩa các lớp bằng cách sử dụng từ khóa class.

Ví dụ về lớp

class Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }

    speak() {
        console.log(`${this.name} makes a noise.`);
    }
}

const dog = new Animal("Dog");
dog.speak(); // Kết quả: Dog makes a noise.

2. Đối tượng (Object)

Đối tượng là một thể hiện (instance) của lớp. Nó chứa các giá trị cụ thể cho các thuộc tính được định nghĩa trong lớp. TypeScript cho phép tạo ra nhiều đối tượng từ một lớp.

Ví dụ về đối tượng

const cat = new Animal("Cat");
cat.speak(); // Kết quả: Cat makes a noise.

3. Kế thừa (Inheritance)

Kế thừa cho phép một lớp mới (lớp con) kế thừa thuộc tính và phương thức từ một lớp hiện có (lớp cha). Điều này giúp tái sử dụng mã và xây dựng các cấu trúc phức tạp hơn.

Ví dụ về kế thừa

class Dog extends Animal {
    bark() {
        console.log(`${this.name} barks.`);
    }
}

const myDog = new Dog("Buddy");
myDog.speak(); // Kết quả: Buddy makes a noise.
myDog.bark();  // Kết quả: Buddy barks.

4. Đa hình (Polymorphism)

Đa hình cho phép các đối tượng khác nhau được xử lý thông qua cùng một giao diện (interface) hoặc lớp cha. Điều này có nghĩa là bạn có thể sử dụng một phương thức chung nhưng có nhiều cách triển khai khác nhau.

Ví dụ về đa hình

class Cat extends Animal {
    speak() {
        console.log(`${this.name} meows.`);
    }
}

const animals: Animal[] = [new Dog("Buddy"), new Cat("Whiskers")];

for (const animal of animals) {
    animal.speak(); // Kết quả: Buddy makes a noise. Whiskers meows.
}

5. Giao diện (Interface)

Giao diện định nghĩa một bộ quy tắc mà các lớp có thể thực hiện. Nó chỉ định các thuộc tính và phương thức mà một lớp cần có mà không cung cấp cách triển khai. Giao diện giúp đảm bảo rằng các lớp tuân thủ một cấu trúc cụ thể.

Ví dụ về giao diện

interface Shape {
    area(): number;
}

class Rectangle implements Shape {
    constructor(private width: number, private height: number) {}

    area(): number {
        return this.width * this.height;
    }
}

const rectangle = new Rectangle(10, 5);
console.log(rectangle.area()); // Kết quả: 50

6. Trừu tượng (Abstraction)

Trừu tượng cho phép bạn định nghĩa một lớp không thể được khởi tạo trực tiếp, nhưng có thể được kế thừa. Các lớp con phải cung cấp triển khai cho các phương thức trừu tượng.

Ví dụ về trừu tượng

abstract class Animal {
    abstract speak(): void; // Phương thức trừu tượng

    move(): void {
        console.log("Moving...");
    }
}

class Bird extends Animal {
    speak(): void {
        console.log("Chirp chirp!");
    }
}

const bird = new Bird();
bird.speak(); // Kết quả: Chirp chirp!
bird.move();  // Kết quả: Moving...

7. Tính đóng gói (Encapsulation)

Tính đóng gói là việc nhóm các thuộc tính và phương thức trong một lớp, bảo vệ dữ liệu bằng cách sử dụng các modifier như public, private, và protected. Điều này giúp kiểm soát quyền truy cập vào các thuộc tính của lớp.

Ví dụ về tính đóng gói

class BankAccount {
    private balance: number = 0;

    deposit(amount: number) {
        this.balance += amount;
    }

    getBalance(): number {
        return this.balance;
    }
}

const account = new BankAccount();
account.deposit(100);
console.log(account.getBalance()); // Kết quả: 100
// console.log(account.balance); // Lỗi: Property 'balance' is private and only accessible within class 'BankAccount'.

Kết luận

TypeScript hỗ trợ nhiều thuật ngữ và khái niệm trong lập trình hướng đối tượng, giúp lập trình viên xây dựng các ứng dụng mạnh mẽ và dễ bảo trì. Bằng cách sử dụng các tính năng như lớp, đối tượng, kế thừa, đa hình, giao diện, trừu tượng và tính đóng gói, bạn có thể tạo ra mã nguồn có cấu trúc rõ ràng và linh hoạt.