Xem thêm

Tính đa hình trong OOP và những loại đa hình bạn cần biết

Huy Erick
Tính đa hình trong OOP là một khái niệm quen thuộc, tuy nhiên, ít ai thực sự hiểu rõ về nó. Bài viết này sẽ giải thích về Tính đa hình và giới thiệu các...

Tính đa hình trong OOP là một khái niệm quen thuộc, tuy nhiên, ít ai thực sự hiểu rõ về nó. Bài viết này sẽ giải thích về Tính đa hình và giới thiệu các loại đa hình quan trọng mà bạn cần biết.

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 để ám chỉ 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).

Tính đa hình dùng để chỉ việc nhiều phương thức cùng tên nhưng chức năng khác nhau.

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 trì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.

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

Dưới đâ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.

Minh họa về Tính đa hình trong OOP của ngôn ngữ 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.

Minh họa về phương thức ghi đè trong ngôn ngữ lập trình Python.

Đ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 đã có góc nhìn rõ ràng hơn về Tính đa hình trong OOP.

Tham khảo: Geeksforgeeks.org

1