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

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).
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?

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.

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.

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


Tham khảo: Geeksforgeeks.org

Nếu bạn quan tâm, hãy xem các vị trí đang tuyển dụng của Got It tại: bit.ly/gotit-hanoi và đọc thêm về quy trình tuyển dụng tại đây.

Son Phuoc
Son Phuoc
February 06, 2021
0
Share this post to:
Tags:
0 Comments
Inline Feedbacks
View all comments
Các bài viết liên quan
4 khóa học lập trình hướng đối tượng miễn phí cho người mới

4 khóa học lập trình hướng đối tượng miễn phí cho người mới

Nếu bạn muốn theo nghề IT thì sớm muộn cũng phải học lập trình hướng đối tượng. Đây là một kiến thức cơ bản, bắt buộc phải biết. Bài viết sẽ chia sẻ với bạn 4 khóa học miễn phí, phù hợp với người mới bắt đầu. Mục lục1. Học lập trình hướng đối tượng […]
Phương pháp lập trình hướng đối tượng và các ưu, nhược điểm

Phương pháp lập trình hướng đối tượng và các ưu, nhược điểm

Từ lâu phương pháp lập trình hướng đối tượng đã không còn xa lạ với các lập trình viên. Bài viết sẽ chia sẻ với các bạn một số ưu điểm và nhược điểm của phương pháp này. Mục lục1. Phương pháp lập trình hướng đối tượng là gì?2. Ưu điểm của phương pháp lập […]
4 khái niệm bạn phải biết khi lập trình hướng đối tượng

4 khái niệm bạn phải biết khi lập trình hướng đối tượng

Lập trình hướng đối tượng (Object-oriented programming) là một phương pháp quen thuộc đối với các chuyên gia phát triển phần mềm. Sau đây là 4 khái niệm bạn bắt buộc phải biết để hiểu về lập trình hướng đối tượng. Mục lục1. Class (Lớp)2. Objects (Đối tượng)3. Attributes (Thuộc tính)4. Methods (Phương thức) 1. […]
Bài tập lập trình hướng đối tượng cơ bản, nâng cao

Bài tập lập trình hướng đối tượng cơ bản, nâng cao

Đọc về Object-Oriented Programming (OOP) thôi là chưa đủ, quan trọng là bạn phải thực hành. Làm các bài tập lập trình hướng đối tượng sẽ giúp bạn nắm chắc hơn về OOP. Dưới đây là một số bài tập OOP Got It đã tổng hợp được. Hãy cùng làm để thành thạo lập trình […]
Inversion of control là gì? Tìm hiểu Dependency Inversion

Inversion of control là gì? Tìm hiểu Dependency Inversion

Các khái niệm như Dependency Injection, Dependency Inversion hay Inversion of Control là gì đều là những câu hỏi khó kể cả với những kỹ sư kỳ cựu. Nhiều bạn dù đã đi làm vài năm nhưng vẫn chưa thực sự hiểu rõ về các khái niệm này mà chỉ biết sử dụng chúng trong […]
7 câu hỏi thường gặp tring phỏng ván lập trình hướng đối tượng

7 câu hỏi thường gặp tring phỏng ván lập trình hướng đối tượng

Với nền kinh tế hiện đại ngày nay, lập trình viên đang là một nghề được nhiều doanh nghiệp săn đón. Bộ câu hỏi phỏng vấn lập trình hướng đối tượng được chia sẻ sau đây sẽ hỗ trợ bạn nắm bắt cơ hội nghề nghiệp. Cùng tìm hiểu nhé. Mục lụcLập trình hướng đối […]