Nạp chồng chương trình con & Kiểu chung

Tram Ho

Nói riêng về đặc tính Đa Hình Polymorphism, đây không phải là một đặc trưng riêng của OOP mà là một trong số những khái niệm chung phổ biến của lĩnh vực khoa học máy tính nói chung. Và việc biểu thị Polymorphism được quan tâm trong mọi môi trường lập trình bao gồm cả Procedural ProgrammingFunctional Programming.

Trong một bài viết trước đó của Series Tự Học Lập Trình Web Một Cách Thật Tự Nhiên, mình đã cố gắng giới thiệu định nghĩa tổng quan và các kiểu logic biểu thị Polymorphism khi nói tới mô hình lập trình OOP. Trong số các kiểu logic biểu thị Polymorphism được tổng hợp bởi Wikipedia thì ở đây chúng ta đã được thấy Sub-Typing Polymorphism xuất hiện cùng với khái niệm Type'Class.

Ngoài ra thì các kiểu logic biểu thị còn lại là Ad-hoc PolymorphismParametric Polymorphism được hỗ trợ bởi các tính năng khác của ngôn ngữ, bao gồm:

  • Overloading Sub-program – định nghĩa lại các phiên bản khác nhau của cùng một tên gọi sub-program với các bộ chữ ký signature khác nhau, bao gồm bộ kiểu dữ liệu của các tham số và kiểu dữ liệu trả về (nếu có).
  • Generic Type – sử dụng tên biểu trưng trừu tượng Type cho thao tác định kiểu để biểu thị cho kiểu dữ liệu bất kỳ dùng làm tham số cho các sub-programpackage. Sau đó, ở mỗi thời điểm viết code sử dụng các sub-programpackage thì chúng ta có thể chỉ định một kiểu dữ liệu cụ thể tại vị trí của Type tùy nhu cầu sử dụng.

Overloading Sub-program

Ở đây chúng ta sẽ làm một ví dụ nhỏ gói gọn trong tệp khởi chạy main.adb với tên procedurePut_Total sẽ được overload với các signature lần lượt là: Put_Total (String, String)Put_Total (Integer, Integer).

Thao tác overloading function cũng không có gì khác biệt so với procedure, cứ miễn sao chúng ta tạo ra các signature khác nhau cho mỗi phiên bản định nghĩa function cùng tên. Lưu ý duy nhất đó là đối với funtion thì chúng ta sẽ có các signature bao gồm cả kiểu dữ liệu trả về return. Và có lẽ chúng ta sẽ không cần viết thêm code ví dụ cho các funtion .

Generic Sub-program

Hãy xuất phát với một ví dụ đơn giản, định nghĩa generic type sử dụng cho một sub-program.

Như vậy là chúng ta đang có kiểu T được định nghĩa là một generic type và sử dụng để định kiểu cho tham số Value. Lúc này khi viết code sử dụng Print, chúng ta có thể chỉ định kiểu dữ liệu cụ thể tùy mục đích sử dụng.

Lưu ý về trình biên dịch GNAT – Để sử dụng thuộc tính Image của một kiểu bất kỳ T, chúng ta sẽ cần chỉ định cho trình biên dịch chế độ hoạt động sử dụng phiên bản mới nhất của ngôn ngữ Ada.

Tuyệt.. Như vậy là chúng ta đã không phải viết lặp lại code định nghĩa chương trình Print cho mỗi kiểu dữ liệu. Và trong trưởng hợp cần sử dụng thêm nhiều tham số generic khác nữa, chúng ta chỉ cần định nghĩa thêm các generic type khác tương tự như T.

Một lưu ý khác nữa, đó là khi sử dụng các generic sub-program như trên thì chúng ta không hẳn cần phải đặt nhiều tên khác nhau cho sub-program cụ thể, mà có thể viết ở dạng overloading với cùng một tên gọi.

Generic Package

Trong trường hợp muốn sử dụng generic type trong định nghĩa của record, chúng ta sẽ cần phải di chuyển việc khai báo generic type ra phía bên ngoài package. Thao tác này sẽ biểu thị rằng – package này được thiết kế dạng tổng quát.

Đây là code ví dụ của bài viết về con trỏ access mà chúng ta đã đi qua trước đó được viết lại với generic type.

Và khi viết code sử dụng generic package thì chúng ta cũng dùng cú pháp new để chỉ định kiểu dữ liệu cụ thể cho toàn bộ tất cả các vị trí sử dụng T trong định nghĩa của package.

Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về một công cụ rất đặc biệt của Ada – có mặt trong một số ít các ngôn ngữ lập trình khác.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo