TYPESCRIPT 2.X CĂN BẢN
Hàm trong TypeScript Sử dụng hàm generics Sử dụng hàm generics trong TypeScript Sử dụng Array trong TypeScript Sử dụng Tuple trong TypeScript Sử dụng kiểu Array, Tuple, Enum trong TypeScript Interface trong Typescript Hybrid Types với Interface trong TypeScript Khác biệt khi sử dụng 'type' và 'interface' trong TypeScript Cách dùng Enum trong TypeScript Types và interface trong TypeScript Class trong TypeScript Sử dụng Abstract Classes trong TypeScript Sử dụng Interface trong Typescript (phần 2) Sử dụng Casting trong TypeScript Tìm hiểu về Generics trong TypeScript Tìm hiểu về utility types trong Typescript Utility types phổ biến trong Typescript Sử dụng default parameters trong TypeScript Modules trong TypeScript Rest Parameters trong TypeScript Sử dụng Function Overloadings trong TypeScript Sử dụng Type Assertions trong TypeScript Sử dụng Static Methods và Properties trong TypeScript. Sử dụng Access Modifiers trong TypeScript 10 mẹo và thủ thuật hay nhất trong TypeScript 5 Cách giúp bạn loại bỏ "any" trong TypeScript Mapped Types trong TypeScript Dependency Injection trong Typescript 5 ký hiệu khó hiểu cần biết trong TypeScript Cách sử dụng @ts-expect-error trong Typescript Declaration Merging trong TypeScript Tìm hiểu Branded Type trong TypeScript Namespaces trong Typescript Phân biệt Modules và Namespaces trong TypeScript Triple-Slash Directives trong TypeScript là gì? Phần 1: Biến trong TypeScript Phần 2: Biến trong TypeScript Property trong TypeScript Phân tích JSON trong TypeScript Bài tập TypeScript: Các dạng bài tập cơ bản Bài tập TypeScript: Lập trình Hướng đối tượng trong TypeScript Bài tập TypeScript: Kiểu Generic Types trong Typescript Bài tập TypeScript: Các kiểu dữ liệu mảng và tuple. Bài tập TypeScript: Classes và Inheritance trong Typescript Bài 01: TypeScript là gì? TypeScript và Javascript Bài 02: Cài đặt TypeScript Bài 03: TypeScript Basic Types Bài 04: Khai báo biến trong TypeScript Bài 05: Lệnh If Else và Switch Case trong TypeScript Bài 06: Vòng lặp trong TypeScript
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Sử dụng Abstract Classes trong TypeScript

Abstract Classes là một phần quan trọng của hệ thống kiểu dữ liệu mà TypeScript cung cấp. Abstract Classes cho phép bạn định nghĩa các lớp cơ sở (base classes) mà không thể tạo ra các đối tượng cụ thể từ chúng. Thay vào đó, bạn chỉ có thể tạo ra các lớp con (subclasses) từ Abstract Classes và sử dụng chúng để chia sẻ các thuộc tính và phương thức chung. Trong bài viết này, mình sẽ tìm hiểu về cách sử dụng Abstract Classes trong TypeScript, cùng với các ví dụ minh họa và ứng dụng thực tế của chúng.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Abstract Class trong TypeScript là gì?

Trong TypeScript, Abstract Class (Lớp Trừu tượng) là một loại lớp đặc biệt được sử dụng để định nghĩa các kiểu dữ liệu và giao diện chung mà các lớp con cần kế thừa và triển khai. Một Abstract Class có thể chứa các thuộc tính và phương thức giống như lớp thông thường, nhưng nó không thể được khởi tạo để tạo ra các đối tượng cụ thể. Thay vào đó, nó được sử dụng để tạo các lớp con (subclasses) từ đó, và các lớp con này phải triển khai (implement) các phương thức trừu tượng được định nghĩa trong Abstract Class.

Một Abstract Class được định nghĩa bằng từ khóa abstract trước từ khóa class, và nó có thể chứa các phương thức trừu tượng (abstract methods) mà các lớp con phải triển khai.

Abstract Class hữu ích khi bạn muốn xác định một cấu trúc chung cho một nhóm lớp có tính chất tương tự, và bạn muốn đảm bảo rằng các lớp con phải triển khai những phương thức cụ thể. Nó cũng giúp tạo ra sự kế thừa và tái sử dụng mã nguồn.

Bài viết này được đăng tại [free tuts .net]

Dưới đây là ví dụ minh họa về việc sử dụng Abstract Class trong TypeScript:

abstract class Shape {
    abstract calculateArea(): number;

    displayArea(): void {
        console.log(`Area: ${this.calculateArea()}`);
    }
}

class Circle extends Shape {
    constructor(private radius: number) {
        super();
    }

    calculateArea(): number {
        return Math.PI * this.radius * this.radius;
    }
}

const circle = new Circle(5);
circle.displayArea(); // Kết quả: Area: 78.53981633974483

Trong ví dụ này, lớp Shape là một Abstract Class với phương thức trừu tượng calculateArea(). Lớp con Circle kế thừa từ Shape và triển khai phương thức calculateArea() để tính diện tích hình tròn.

Cú pháp của Abstract Classes

Cú pháp của Abstract Classes trong TypeScript rất đơn giản và sử dụng từ khóa "abstract" để đánh dấu một lớp là Abstract Class. Dưới đây là cú pháp và ví dụ chi tiết:

Định nghĩa một Abstract Class

abstract class TenLopAbstract {
    // Khai báo thuộc tính và phương thức
    // ...
}

Sử dụng Abstract Class

Bạn không thể tạo đối tượng trực tiếp từ một Abstract Class, nhưng bạn có thể tạo các lớp con từ nó và sử dụng chúng.

class LopCon extends TenLopAbstract {
    // Triển khai các phương thức trừu tượng và thêm các thuộc tính khác
    // ...
}

Ví dụ:

abstract class Animal {
    abstract makeSound(): void;
}

class Dog extends Animal {
    makeSound(): void {
        console.log("Gâu gâu");
    }
}

const dog = new Dog();
dog.makeSound(); // Kết quả: Gâu gâu

Trong ví dụ này, lớp Animal là một Abstract Class với phương thức trừu tượng makeSound(). Lớp con Dog kế thừa từ Animal và triển khai phương thức makeSound() để in ra tiếng "Gâu gâu" khi gọi phương thức này trên đối tượng dog.

Phương thức Abstract trong Abstract Classes

Phương thức Abstract (abstract methods) trong Abstract Classes là cách để định nghĩa giao diện (interface) mà các lớp con phải triển khai. Phương thức Abstract không có cài đặt trong Abstract Class và không có dấu ngoặc nhọn ({}), chỉ có tên phương thức và kiểu trả về (nếu có). Các lớp con phải cung cấp triển khai cụ thể cho phương thức Abstract, nếu không TypeScript sẽ báo lỗi.

Dưới đây là cách sử dụng phương thức Abstract trong Abstract Classes và một ví dụ minh họa:

Sử dụng phương thức Abstract

abstract class TenLopAbstract {
    abstract tenPhuongThuc(): void;
}

Triển khai phương thức Abstract trong lớp con

class LopCon extends TenLopAbstract {
    tenPhuongThuc(): void {
        // Triển khai phương thức ở đây
    }
}

Ví dụ:

abstract class Animal {
    abstract makeSound(): void;
}

class Dog extends Animal {
    makeSound(): void {
        console.log("Gâu gâu");
    }
}

class Cat extends Animal {
    makeSound(): void {
        console.log("Meow meow");
    }
}

const dog = new Dog();
dog.makeSound(); // Kết quả: Gâu gâu

const cat = new Cat();
cat.makeSound(); // Kết quả: Meow meow

Trong ví dụ này, lớp Animal là một Abstract Class với phương thức trừu tượng makeSound(). Lớp con Dog Cat kế thừa từ Animal và triển khai phương thức makeSound() để tạo ra tiếng kêu của chó và mèo.

Kế thừa và Abstract Classes

Kế thừa (inheritance) trong TypeScript cho phép bạn mở rộng Abstract Classes bằng cách tạo các lớp con (subclasses) từ chúng. Lớp con kế thừa tất cả thuộc tính và phương thức của lớp cha (Abstract Class) và có khả năng triển khai các phương thức trừu tượng được định nghĩa trong lớp cha.

Dưới đây là cách sử dụng kế thừa và một ví dụ minh họa:

Sử dụng kế thừa để tạo lớp con

abstract class TenLopAbstract {
    abstract tenPhuongThuc(): void;
}

class LopCon extends TenLopAbstract {
    tenPhuongThuc(): void {
        // Triển khai phương thức ở đây
    }
}
Ví dụ về kế thừa và triển khai:
abstract class Animal {
    abstract makeSound(): void;
}

class Dog extends Animal {
    makeSound(): void {
        console.log("Gâu gâu");
    }
}

class Cat extends Animal {
    makeSound(): void {
        console.log("Meow meow");
    }
}

const dog = new Dog();
dog.makeSound(); // Kết quả: Gâu gâu

const cat = new Cat();
cat.makeSound(); // Kết quả: Meow meow

Trong ví dụ này, lớp Animal là một Abstract Class với phương thức trừu tượng makeSound(). Lớp con Dog và Cat kế thừa từ Animal và triển khai phương thức makeSound() để tạo ra tiếng kêu của chó và mèo.

Kế thừa trong Abstract Classes cho phép bạn tạo các lớp con có tính chất tương tự và chia sẻ mã nguồn, đồng thời đảm bảo rằng các lớp con phải triển khai các phương thức trừu tượng mà lớp cha định nghĩa.

Ví dụ minh họa

Các ví dụ minh họa trong bài viết sẽ cung cấp mã nguồn cụ thể và ví dụ về cách sử dụng Abstract Classes trong TypeScript. Đối với mỗi ví dụ, mã nguồn và cách triển khai các lớp con của Abstract Classes sẽ được cung cấp để minh họa cách sử dụng chúng.

Ví dụ (sử dụng Abstract Classes để thiết kế lớp hình học):

abstract class Shape {
  abstract calculateArea(): number;
  abstract calculatePerimeter(): number;
}

class Circle extends Shape {
  constructor(private radius: number) {
    super();
  }

  calculateArea(): number {
    return Math.PI * this.radius ** 2;
  }

  calculatePerimeter(): number {
    return 2 * Math.PI * this.radius;
  }
}

class Rectangle extends Shape {
  constructor(private width: number, private height: number) {
    super();
  }

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

  calculatePerimeter(): number {
    return 2 * (this.width + this.height);
  }
}

Trong ví dụ này, bạn có mã nguồn minh họa việc sử dụng Abstract Class "Shape" và các lớp con "Circle" và "Rectangle" để tính toán diện tích và chu vi của các hình học.

Ví dụ tiếp theo về việc sử dụng Abstract Classes trong ứng dụng quản lý tài liệu cũng sẽ cung cấp mã nguồn và ví dụ cụ thể.

Kết bài

Trong bài viết này, mình đã tìm hiểu về Abstract Classes trong TypeScript và cách chúng có thể được sử dụng để định nghĩa cấu trúc chung cho các đối tượng có tính chất tương tự. Mình đã tìm hiểu cú pháp của Abstract Classes, cách triển khai các phương thức trừu tượng, và cách các lớp con kế thừa và mở rộng Abstract Classes để thêm tính năng cụ thể.

Abstract Classes cung cấp một cách tiếp cận mạnh mẽ để tái sử dụng mã nguồn và thiết kế các lớp đối tượng có cấu trúc chung. Chúng có thể được áp dụng trong nhiều tình huống thực tế, từ thiết kế hình học đến quản lý tài liệu và nhiều ứng dụng khác.

Tuy Abstract Classes có nhiều lợi ích, nhưng cũng cần phải xem xét các hạn chế và lưu ý khi sử dụng chúng. Việc hiểu rõ cách sử dụng Abstract Classes trong TypeScript có thể giúp tối ưu hóa thiết kế của bạn và tạo ra mã nguồn dễ bảo trì.

Hy vọng rằng bài viết này đã giúp bạn hiểu hơn về Abstract Classes và cách chúng có thể được áp dụng trong TypeScript.

Cùng chuyên mục:

Bài tập TypeScript: Classes và Inheritance trong Typescript

Bài tập TypeScript: Classes và Inheritance trong Typescript

Bài tập TypeScript: Các kiểu dữ liệu mảng và tuple.

Bài tập TypeScript: Các kiểu dữ liệu mảng và tuple.

Bài tập TypeScript: Kiểu Generic Types trong Typescript

Bài tập TypeScript: Kiểu Generic Types trong Typescript

Bài tập TypeScript: Lập trình Hướng đối tượng trong TypeScript

Bài tập TypeScript: Lập trình Hướng đối tượng trong TypeScript

Bài tập TypeScript: Các dạng bài tập cơ bản

Bài tập TypeScript: Các dạng bài tập cơ bản

Phân tích JSON trong TypeScript

Phân tích JSON trong TypeScript

Property trong TypeScript

Property trong TypeScript

Phần 2: Biến trong TypeScript

Phần 2: Biến trong TypeScript

Phần 1: Biến trong TypeScript

Phần 1: Biến trong TypeScript

Triple-Slash Directives trong TypeScript là gì?

Triple-Slash Directives trong TypeScript là gì?

Phân biệt Modules và Namespaces trong TypeScript

Phân biệt Modules và Namespaces trong TypeScript

Tìm hiểu Branded Type trong TypeScript

Tìm hiểu Branded Type trong TypeScript

Namespaces trong Typescript

Namespaces trong Typescript

Declaration Merging trong TypeScript

Declaration Merging trong TypeScript

Cách sử dụng @ts-expect-error trong typescript

Cách sử dụng @ts-expect-error trong typescript

5 ký hiệu khó hiểu cần biết trong TypeScript

5 ký hiệu khó hiểu cần biết trong TypeScript

Dependency Injection trong Typescript

Dependency Injection trong Typescript

Mapped Types trong TypeScript

Mapped Types trong TypeScript

5 Cách giúp bạn loại bỏ

5 Cách giúp bạn loại bỏ "any" trong TypeScript

10 mẹo và thủ thuật hay nhất trong TypeScript

10 mẹo và thủ thuật hay nhất trong TypeScript

Top