Sử dụng Abstract Classes trong TypeScript

Một abstract class(lớp trừu tượng) là một lớp cơ sở, thường được sử dụng để định nghĩa các hành vi chung cho các lớp dẫn xuất(lớp kế thừa). Không giống như lớp bình thường, một lớp abstract không thể được khởi tạo trực tiếp. Để khai báo một lớp abstract, bạn sử dụng từ khóa

Một abstract class(lớp trừu tượng) là một lớp cơ sở, thường được sử dụng để định nghĩa các hành vi chung cho các lớp dẫn xuất(lớp kế thừa). Không giống như lớp bình thường, một lớp abstract không thể được khởi tạo trực tiếp.
Để khai báo một lớp abstract, bạn sử dụng từ khóa abstract :

abstractclassEmployee{//...}

Thông thường, một lớp abstract chứa một hoặc nhiều phương thức abstract .
Một phương thức của lớp abstract không chứa các thực thi code bên trong. Nó chỉ định nghĩa tên của phương thức mà không thực thi gì. Các thực thi của phương thức abstract sẽ được thực hiện bên trong lớp dẫn xuất.
Ví dụ hiển thị lớp abstract là Employee cái có phương thức abstract là getSalary().

abstractclassEmployee{constructor(private firstName:string,private lastName:string){}abstractgetSalary():numbergetfullName():string{return`${this.firstName}${this.lastName}`;}compensationStatement():string{return`${this.fullName} makes ${this.getSalary()} a month.`;}}

Giải thích lớp Employee

  • Constructor khai báo các thuộc tính firstNamelastName.
  • Phương thức getSalary() là một phương thức abstract. Lớp dẫn xuất sẽ thực thi logic dựa trên loại của employee.
  • Phương thức getFullName()compensationStatement() chứa chi tiết các thực thi. Lưu ý rằng phương thức compensationStatement () gọi phương thức getSalary().

Vì lớp Employee là một abstract, bạn không thể khởi tạo một new object từ nó. Câu lệnh sau đây gây ra lỗi:

let employee =newEmployee('John','Doe');

Error:

error TS2511: Cannot create an instance of an abstractclass.

Lớp FullTimeEaffee sau đây kế thừa từ lớp Employee:

classFullTimeEmployeeextendsEmployee{constructor(firstName:string, lastName:string,private salary:number){super(firstName, lastName);}getSalary():number{returnthis.salary;}}

Trong class FullTimeEmployee , salary được đặt trong constructor. Vì getSalary() là một phương thức trừu tượng của lớp Employee, dó đó bạn cũng cần tạo một phương thức getSalary() trong lớp FullTimeEprisee và thực hiện logic trong phương thức này.Trong ví dụ này, nó chỉ trả về tiền lương mà không cần bất kỳ phép tính nào.

Phần sau cho thấy class Contractor cũng kế thừa từ lớp Employee :

classContractorextendsEmployee{constructor(firstName:string, lastName:string,private rate:number,private hours:number){super(firstName, lastName);}getSalary():number{returnthis.rate *this.hours;}}

Trong lớp Contractor, hàm khởi tạo khởi tạo rate(tỷ lệ) và hours(giờ). Phương thức getSalary() tính toán mức lương bằng cách nhân tỷ lệ với giờ.
Tiếp tục tạo một đối tượng FullTimeEaffee và một đối tượng Contractor:

let john =newFullTimeEmployee('John','Doe',12000);let jane =newContractor('Jane','Doe',100,160);console.log(john.compensationStatement());console.log(jane.compensationStatement());

Output:

John Doe makes 12000 a month.
Jane Doe makes 16000 a month.

Tóm tắt:

  • Các lớp trừu tượng không thể được khởi tạo.
  • Một lớp trừu tượng có ít nhất một phương thức trừu tượng.
  • Để sử dụng một lớp trừu tượng, bạn cần kế thừa nó và cung cấp thực hiện các xử lý cho các phương thức trừu tượng

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ