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

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

Tổng quan về Tính đa hình trong OOP

Khái niệm

Tính đa hình là một trong tứ tính chất cơ bản của lập trình hướng đối tượng (OOP), bao gồm tính đóng gói, tính kế thừa và tính trừu tượng.

Trong tiếng Hy Lạp, thuật ngữ “polymorphism” có nghĩa là “đa hình”. Trong lập trình, thuật ngữ này được sử dụng để 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. Điều này có nghĩa là nhiều hàm hoặc phương thức có thể có 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

Có thể sử dụng tính đa hình trong lập trình hướng đối tượng (OOP) cho những trường hợp sau đây:

  • Khi các lớp con cần sử dụng phương thức từ lớp cha để mở rộng cho một phương thức khác.
  • Khi một lớp cần sử dụng nhiều phương thức có tên giống nhau nhưng có tham số khác nhau.
  • Tính đa hình trong OOP dùng để chỉ việc nhiều phương thức cùng tên nhưng chức năng khác nhau (Nguồn: Unsplash).
    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 (Nguồn: Unsplash).

    Vì sao phải dùng Tính đa hình?

    Nếu lập trình viên biết sử dụng Tính đa hình, thì việc phát triển phần mềm sẽ mang lại nhiều lợi ích. Các lợi ích có thể là:

  • Lập trình viên không cần 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 thông qua Tính đa hình.
  • Lập trình viên có khả năng sử dụng một tên duy nhất để lưu trữ biến của nhiều loại dữ liệu khác nhau như float, double, long, int,…
  • Lập trình viên có thể mở rộng Tính trừu tượng từ các đoạn mã đơn giản. Bạn có thể tham khảo thông tin này qua các 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

    Hãy cùng tưởng tượng xem 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 là một chuyên gia y tế được đào tạo để thực hiện các thủ thuật phẫu thuật trên cơ thể con người.
  • Nhà thiết kế kiểu tóc.
  • Diễn viên.
  • Sau đó, điều gì sẽ diễn ra?

  • Bác sĩ phẫu thuật là một chuyên gia y tế được đào tạo để thực hiện các thủ thuật phẫu thuật trên cơ thể con người. sẽ bắt đầu rạch dao mổ.
  • Nhà tạo mẫu sẽ bắt đầu cắt tóc cho một người nào đó.
  • Nam diễn viên sẽ dừng lại trong việc diễn cảnh hiện tại và đợi sự chỉ dẫn của đạo diễn.
  • Ví dụ trên minh họa bản chất của Tính đa hình. Nó biểu trưng cho việc cùng một tên gọi nhưng có hành vi khác nhau.

    Tính đa hình trong OOP

    Dưới đây là một ví dụ minh họa về Tính đa hình trong OOP, được viết bằng 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.
    Minh họa về Tính đa hình trong OOP của ngôn ngữ Python.

    Chúng ta có thể nhận thấy từ đoạn mã trên rằng chương trình chứa hai hàm có cùng tên là “print”. Tuy nhiên, hai hàm này lại có các tham số khác nhau, điều này dẫn đến hai chức năng hoàn toàn khác nhau cho mỗi hàm. Chi tiết như sau:

  • Hàm đầu tiên print có một tham số kiểu chuỗi. Nhiệm vụ của hàm này là in ra màn hình một chuỗi.
  • Hàm print thứ hai nhận vào một danh sách và có kiểu tham số là list. Nhiệm vụ của hàm này là in ra màn hình một danh sách. Trong trường hợp này, danh sách đó là danh sách các số nguyên.
  • Các loại đa hình cần biết

    Trong OOP, có hai loại đa hình là đa hình thời gian chạy (Runtime Polymorphism) và đa hình thời gian biên dịch (Compile Time Polymorphism).

    Tính đa hình cho phép một phương thức thực hiện những hành vi khác nhau theo hai hướng: ghi đè phương thức hoặc nạp chồng phương thức.

    Đa hình thời gian chạy

    Đây là một trường hợp mà 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 điểm chương trình đang hoạt động.

    Phương thức ghi đè được sử dụng để thực hiện đa hình trong thời gian chạy. Cụ thể, lớp con sẽ tái sử dụng một phương thức có cùng tên với phương thức có sẵn của lớp cha.

    Minh họa về phương thức ghi đè trong ngôn ngữ lập trình Python.
    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à một trường hợp khi một đối tượng bị ràng buộc với chức năng của chúng ngay từ thời điểm chương trình đang được biên dịch.

    Công nghệ đa hình trong lập trình cho phép chúng ta sử dụng phương thức nạp chồng. Điều này có nghĩa là chúng ta có thể có các phương thức hoặc hàm cùng tên, nhưng khác nhau về số lượng và loại tham số được truyền vào. Khi gọi phương thức, kết quả trả về sẽ phụ thuộc vào số lượng tham số mà ta truyền vào.

    Lưu ý về Tính đa hình

    Mỗi ngôn ngữ lập trình có cách tiếp cận khác nhau đối với Tính đa hình. Ví dụ, trong Java và C++, có hỗ trợ phương thức nạp chồng, trong khi Python và JavaScript không có.

    Trong Python, bạn có thể sử dụng phương thức nạp chồng, tuy nhiên chỉ lần khởi tạo cuối cùng được ghi nhớ. Vì vậy, việc sử dụng ngôn ngữ nào cũng đòi hỏi bạn phải nghiên cứu kỹ về tính đa hình của ngôn ngữ đó để làm chủ nó tốt hơn.

    Tính đa hình là một tính chất hữu ích mà lập trình viên có thể khai thác. Hy vọng qua bài viết này, các bạn sẽ có cái nhìn sâu sắc hơn về tính đa hình trong lập trình hướng đối tượng.