Nếu bạn chú ý, bạn sẽ nhận ra các đối tượng trong Pascal thể hiện một số tính chất của lập trình hướng đối tượng như đóng gói, ẩn dữ liệu và thừa kế dữ liệu. Tuy nhiên, đối tượng trong Pascal không tham gia vào đa hình, vì vậy lớp trong Pascal được sử dụng để triển khai các hành vi hướng đối tượng chính xác trong các ứng dụng, đặc biệt là các ứng dụng dựa trên giao diện đồ họa.
Lớp trong Pascal được định nghĩa gần giống như đối tượng trong Pascal, với điểm khác biệt là lớp trong Pascal là con trỏ tới đối tượng. Kỹ thuật thì lớp thường được cấp phát trên Heap của chương trình, trong khi đối tượng thường được cấp phát trên Stack.
Nói một cách khác, khi khai báo một biến kiểu đối tượng, nó sẽ chiếm một không gian lớn trên Stack tương đương với kích thước của đối tượng, nhưng khi khai báo một biến kiểu lớp, nó chỉ chiếm một kích thước con trỏ trên Stack. Dữ liệu thực sự của lớp sẽ được phân bổ trên Heap.
Khái niệm về lớp trong Pascal
Lớp trong Pascal được khai báo tương tự như đối tượng, sử dụng khai báo kiểu. Cấu trúc chung của khai báo lớp có dạng như sau:
Một số điều quan trọng cần nhớ:
- Để định nghĩa một lớp, bạn phải viết nó trong phần khai báo kiểu của chương trình.
- Lớp trong Pascal được xác định bằng từ khóa class.
- Trường là các thành phần dữ liệu tồn tại trong mỗi đối tượng của lớp.
- Các phương thức được khai báo trong định nghĩa của lớp.
- Constructor được định nghĩa trước trong lớp Gốc có tên là Create. Mỗi lớp trừu tượng và lớp cụ thể là lớp con của lớp Gốc, vì vậy tất cả các lớp đều có ít nhất một constructor.
- Ngoài ra trong lớp Gốc còn có một destructor được định nghĩa trước có tên là Destroy. Mỗi lớp trừu tượng và lớp cụ thể là lớp con của lớp Gốc, vì vậy tất cả các lớp đều có ít nhất một destructor.
Ví dụ sau đây mô tả lớp Hình chữ nhật có 2 thành viên dữ liệu là chiều dài và chiều rộng, cùng một số hàm thành viên để thao tác dữ liệu và một phương thức để vẽ hình chữ nhật.
Ví dụ tiếp theo trình bày một chương trình hoàn chỉnh tạo đối tượng của lớp Hình chữ nhật và vẽ nó ra màn hình. Ví dụ này tương tự như ví dụ mà Mytour đã giới thiệu trong phần đối tượng trong Pascal. Hai chương trình tương tự nhau, chỉ khác biệt ở phần dưới đây:
- Để sử dụng các lớp, phải thêm {$mode objfpc}.
- Thêm {$m+} để sử dụng constructor.
- Khác biệt giữa thực thể của lớp và đối tượng. Khi khai báo biến mà không cấp phát không gian cho thực thể, cần sử dụng constructor create để phân bổ bộ nhớ.
Dưới đây là một ví dụ hoàn chỉnh:
Các thuộc tính hiển thị của thành viên lớp
Thuộc tính hiển thị quy định khả năng truy cập của các thành viên, tức là vị trí chính xác mà các thành viên có thể truy cập được. Trong Pascal, có 5 cấp độ hiển thị: Public (công khai), Private (riêng tư), Strict Private, Protected (bảo vệ) và Published.
Constructor và Destructor trong lớp Pascal
Constructor là một phương thức đặc biệt, tự động được gọi mỗi khi một đối tượng được tạo ra. Người dùng có thể tận dụng các hành vi này bằng cách khởi tạo nhiều thứ thông qua hàm constructor.
Pascal cung cấp hàm đặc biệt có tên là tạo() để định nghĩa constructor. Bạn có thể thêm nhiều tham số vào hàm constructor nếu cần.
Ví dụ sau đây minh họa việc tạo một constructor cho lớp có tên là Sách và nó sẽ khởi tạo giá và tên cho cuốn sách khi đối tượng được tạo.
Khi đoạn mã trên được biên dịch và thực thi, nó sẽ trả về kết quả sau:
Phương thức của destructor giải phóng đối tượng bằng cách giải phóng tất cả các tài nguyên được sử dụng trong lớp.
Kế thừa trong lớp Pascal
Cú pháp trong Pascal cho phép lớp con tùy chọn kế thừa từ lớp cha như sau:
type
tên-lớp-con = class(tên-lớp-cha)
< thành viên=''>
end;
Ví dụ dưới đây mô tả lớp Novels, kế thừa từ lớp Books và mở rộng một số hàm theo yêu cầu.
Khi mã trên được biên dịch và thực thi, kết quả sẽ như sau:
Những điều cần lưu ý:
- Các thành viên của lớp Books phải được đặt ở mức Protected.
- Lớp Novels có 2 constructor, vì vậy sử dụng toán tử overload cho hàm chồng.
- Phương thức Display của lớp Books được khai báo là ảo, vì vậy phương thức từ lớp Novels có thể ghi đè nó.
- Constructor Novels.Create sử dụng từ khóa inherited để gọi constructor của lớp cha.
Giao diện trong Pascal
Giao diện trong Pascal được định nghĩa để cung cấp tên hàm chung cho người triển khai. Người triển khai có thể triển khai các giao diện theo nhu cầu. Có thể nói giao diện là một bộ khung, được triển khai bởi các nhà phát triển. Dưới đây là một ví dụ về giao diện trong Pascal:
Lưu ý, khi một lớp triển khai giao diện, lớp đó phải triển khai tất cả các phương thức của giao diện. Nếu phương thức của giao diện không được triển khai, trình biên dịch sẽ thông báo lỗi.
Lớp trừu tượng trong Pascal
Lớp trừu tượng trong Pascal là lớp không thể được khởi tạo, chỉ có thể được kế thừa. Lớp trừu tượng được định nghĩa bằng cách sử dụng từ khóa abstract trong định nghĩa lớp như sau:
Khi kế thừa từ một lớp trừu tượng, tất cả các phương thức được đánh dấu trừu tượng trong khai báo của lớp cha phải được định nghĩa bởi lớp con. Ngoài ra, phương thức này phải được định nghĩa với cùng thuộc tính hiển thị.
Từ khóa Static trong Pascal
Khi khai báo các thành viên lớp hoặc phương thức là tĩnh, chúng có thể được truy cập mà không cần khởi tạo đối tượng lớp. Một thành viên được khai báo là tĩnh không thể truy cập bằng thực thể của đối tượng lớp.
Xem ví dụ dưới đây để hiểu rõ hơn về khái niệm này:
Khi đoạn mã trên được biên dịch và thực thi, kết quả sẽ như sau:
Để đánh dấu các thành viên là tĩnh, bạn cần sử dụng {$static on}.
Bài viết trên đã giúp bạn hiểu sâu hơn về lớp trong Pascal. Bạn có thể khám phá thêm về Pascal qua các bài viết khác như mảng trong Pascal trên Mytour. Nếu cần hỗ trợ hoặc có thắc mắc, đừng ngần ngại để lại ý kiến của bạn trong phần bình luận dưới bài viết.