Tính đa hình trong OOP là một nội dung không mới, nhưng ít ai thực sự hiểu rõ về khái niệm này. Bài viết sẽ giải thích về Tính đa hình cũng như giới thiệu về các loại đa hình mà bạn cần biết.
Mục lục
Tổng quan về Tính đa hình trong OOP
Khái niệm
Tính đa hình (Polymorphism) là một trong bốn tính chất cơ bản của Lập trình hướng đối tượng (Object-oriented programming – viết tắt là OOP). Các tính chất còn lại bao gồm: Tính đóng gói (Encapsulation), Tính kế thừa (Inheritance) và Tính trừu tượng (Abstraction).
Trong tiếng Hy Lạp, thuật ngữ “polymorphism” mang ý nghĩa là “có nhiều dạng”. Tương tự, trong lập trình thuật ngữ này dùng để ám chỉ đến việc một biến, một hàm hoặc một phương thức có thể tồn tại ở nhiều dạng khác nhau. Tức là nhiều hàm hoặc phương thức có thể cùng một tên nhưng chức năng thực sự của chúng lại khác nhau.
Mục đích của Tính đa hình
Lập trình viên có thể tận dụng Tính đa hình trong OOP vào những trường hợp sau:
- Khi các lớp con cần dùng phương thức của lớp cha để bổ sung cho một phương thức khác.
- Khi một lớp cần có nhiều phương thức cùng tên nhưng khác tham số (parameter).
Vì sao phải dùng Tính đa hình?
Nhìn chung, nếu lập trình viên tận dụng được Tính đa hình thì sẽ mang lại nhiều lợi ích trong quá trình phát triển phần mềm. Những lợi ích đó có thể là:
- Lập trình viên không phải viết lại mã hoặc lớp đã có sẵn. Sau khi một đoạn mã hoặc lớp được khởi tạo thành công, ta có thể tái sử dụng chúng nhờ vào Tính đa hình.
- Lập tình viên có thể dùng một tên duy nhất để lưu trữ biến của nhiều kiểu dữ liệu khác nhau (float, double, long, int,…).
- Lập trình viên có thể phát triển thêm Tính trừu tượng từ những đoạn mã đơn giản. Bạn có thể tham khảo nội dung này ở những bài viết liên quan.
Minh họa về Tính đa hình
Tính đa hình trong đời sống
Bạn hãy thử tưởng tượng nếu bạn yêu cầu những người sau thực hiện hành động “CẮT”:
- Bác sĩ phẫu thuật
- Nhà tạo mẫu tóc
- Diễn viên
Khi đó, chuyện gì sẽ xảy ra?
- Bác sĩ phẫu thuật sẽ bắt đầu rạch dao mổ.
- Nhà tạo mẫu sẽ bắt đầu cắt tóc cho một ai đó.
- Nam diễn viên sẽ ngừng diễn cảnh hiện tại, chờ đạo diễn hướng dẫn.
Ví dụ trên cho thấy bản chất của Tính đa hình. Nó tượng trưng cho việc cùng một tên gọi nhưng hành vi thì khác nhau.
Tính đa hình trong OOP
Sau đây là một ví dụ về Tính đa hình trong OOP được viết theo ngôn ngữ lập trình Python.
Từ đoạn mã trên, chúng ta thấy rằng trong chương trình có hai hàm cùng mang tên là “print”. Tuy nhiên, hai hàm lại có tham số khác nhau. Do đó, chức năng của hai hàm này cũng hoàn toàn khác nhau. Cụ thể:
- Hàm print thứ nhất có tham số kiểu chuỗi (string). Vì vậy, mục đích của hàm này là để in một chuỗi ra màn hình.
- Hàm print thứ hai có tham số kiểu danh sách (list). Vì vậy, mục đích của hàm này là để in một danh sách ra màn hình. Trong trường hợp trên là danh sách kiểu số nguyên (int).
Các loại đa hình cần biết
Tính đa hình trong OOP gồm có hai loại: Đa hình thời gian chạy (Runtime Polymorphism) và Đa hình thời gian biên dịch (Compile Time Polymorphism).
Theo đó, Tính đa hình cho phép một phương thức thực thi những hành vi khác nhau theo hai hướng: sử dụng phương thức ghi đè (method overriding) hoặc phương thức nạp chồng (method overloading).
Đa hình thời gian chạy
Đây là trường hợp một đối tượng bị ràng buộc với chức năng của chúng ngay tại thời gian chương trình đang chạy.
Đa hình thời gian chạy sử dụng phương thức ghi đè. Cụ thể, lớp con sẽ dùng lại một phương thức cùng tên với phương thức sẵn có của lớp cha.
Đa hình thời gian biên dịch
Đây là trường hợp một đối tượng bị ràng buộc với chức năng của chúng ngay tại thời gian chương trình đang biên dịch.
Đa hình thời gian biên dịch sử dụng phương thức nạp chồng. Cụ thể, các phương thức hoặc hàm có thể cùng tên, nhưng sẽ khác một số tham số (parameter) được truyền vào trong lệnh gọi. Tùy vào số lượng tham số được truyền vào mà phương thức đó sẽ cho ra các kết quả khác nhau.
Lưu ý về Tính đa hình
Vẫn còn một điểm mà bạn cần lưu ý về Tính đa hình. Đó là mỗi ngôn ngữ lập trình khác nhau lại có cách tiếp cận khác nhau. Chẳng hạn, Java, C ++ có hỗ trợ phương thức nạp chồng nhưng Python, JavaScript thì không.
Trong Python, bạn có thể dùng phương thức nạp chồng nhưng chương trình sẽ chỉ ghi nhớ lần khởi tạo cuối cùng. Do đó, khi sử dụng ngôn ngữ nào thì bạn cần phải nghiên cứu thật kỹ về Tính đa hình của ngôn ngữ bạn đang dùng để làm chủ nó tốt hơn.
Tóm lại, Tính đa hình là một tính chất hay mà lập trình viên nên tận dụng. Hy vọng qua bài viết, các bạn sẽ có góc nhìn rõ ràng hơn về Tính đa hình trong OOP.
Tham khảo: Geeksforgeeks.org