Trang chủ > Uncategorized > Tóm lại polymorphism trong OOP là gì nhỉ?

Tóm lại polymorphism trong OOP là gì nhỉ?

(Bài này khá linh tinh và có thể chứa thông tin không chính xác. Nếu bạn mới học lập trình thì không nên đọc.)

Khi chưa tìm hiểu kĩ về polymorphism, tôi có cảm giác polymorphism là một cái gì đó khá mơ hồ. Nói chung thì các sách khi để cập đến vấn đề này đều dùng ví dụ minh họa hơn là định nghĩa chính xác. Với những tài liệu có định nghĩa, thì có vẻ như đánh đồng polymorphism và overriding. Tuy nhiên, trong khi với những ngôn ngữ như Java các method đều là virtual method thì cũng có những ngôn ngữ như C# trong đó virtual method và overriding phải được phát biểu một cách rõ ràng. Tuy nhiên, như ta đã biết, polymorphism cùng với encapsulation và inheritance thường được giới thiệu như là ba cột trụ (pillar) của OOP. Nếu polymorphism đồng nghĩa với overriding và virtual method thì tại sao những ngôn ngữ như C# lại có vẻ như hạn chế cột trụ này? (Nói ngoài lề là thực ra việc đòi hỏi phát biểu virtual method và overriding một cách rõ ràng trong C# có cái lí của nó, chứ không phải là để hạn chế.)

Thực tế là, khi đọc các tài liệu mang tính lí thuyết hơn, bạn sẽ thấy polymorphism không phải là một khái niệm của riêng OOP, càng không đồng nghĩa với overriding. Mặc dù không phải tất cả các tài liệu đều viết giống nhau, nhưng nhìn chung có thể định nghĩa polymorphism là tính chất cho phép các cấu trúc gồm hàm và kiểu dữ liệu có thể làm việc với nhiều kiểu dữ liệu khác nhau. Có ba dạng polymorphism:

  • Parametric polymorphism: Các type liên quan đến cấu trúc được cung cấp dưới dạng biểu thức trong đó type là các biến. Chẳng hạn, C++ template chính là một cơ chế hỗ trợ parametric polymorphism trong ngôn ngữ này. Tất nhiên, parametric polymorphism có thể có trong các ngôn ngữ không hỗ trợ OOP.
  • Ad hoc polymorphism: Thuật ngữ này dùng để chỉ overloading. Ví dụ phổ biến là toán tử + có thể là một function dạng int * int –> int, cũng có thể là một function dạng string * string –> string. Một số người không đồng ý xem overloading là một dang polymorphism.
  • Subtype polymorphism: Đây là dạng polymorphism mà thuật ngữ “polymorphism” trong OOP chỉ tới. Với subtype polymorphism, một method có thể áp dụng cho nhiều type khác nhau thông qua subtyping. Cụ thể, nếu một method áp dụng được cho type T, nó sẽ áp dụng được cho subtype của T. Quan hệ subtype thường được thiết lập thông qua inheritance. Chú ý là, định nghĩa này không đề cập đến overriding hay virtual method gì cả. Một ngôn ngữ OOP có thể không hỗ trợ overriding mà vẫn thỏa mãn subtype polymorphism.

Một điểm đáng chú ý là trừ Wikipedia, tôi chưa thấy có nguồn nào coi overriding là một dạng polymorphism cả.

Tóm lại nên định nghĩa polymorphism như thế nào? Về mặt lương tâm mà nói thì có lẽ cần trình bày dựa theo lí thuyết về ngôn ngữ lập trình. Về mặt cảm giác, tôi nghĩ định nghĩa polymorphism trong OOP bằng subtype polymorphism tuy trông thì phức tạp nhưng lại đơn giản, mạch lạc, ít mơ hồ hơn định nghĩa thông qua overriding (đương nhiên kéo theo người học dễ hiểu, dễ nhớ, dễ hệ thống hơn). Về thực tế thì vì định nghĩa về polymorphism trong OOP thông qua overriding (và kéo theo hiểu rằng polymorphism là đặc trưng của OOP) đã quá phổ biến, mà hiểu sao thì tóm lại vẫn là biết lập trình, nên có lẽ cũng không cần bận tâm đến polymorphism thực sự là cái gì nữa😀.

Các bạn có thể tham khảo thêm trong Concepts in programming languages và Programming languages pragmatics.

  1. DucMV
    Tháng Tư 6, 2011 lúc 4:56 chiều

    Hi Bác.
    Đọc qua mấy bài viết trên blog của bác cho thấy bác là người có nhiều kinh nghiệm trong lập trình😀.Tuy nhiên đọc bài này em thấy không đồng ý với bác ở quan điểm polymorphism hay còn gọi là đa hình cho gọn😀,theo em vẫn hiểu từ trước đến giờ đa hình là sự thực hiện một behavior tùy thuộc vào type của object😀

  2. PhucSg
    Tháng Năm 13, 2011 lúc 2:42 chiều

    Người nào không hiểu về polymorphism đọc qua bài của bạn mù luôn, với dân IT đơn giản ngăn gọn dể hiểu. Bạn có thể hiểu polymorphism qua vidu dưới:
    vehicles có nhiêu loại Car, Bicycle, Train, Plan nhưng đểu có chung Stop operation

  3. Khách
    Tháng Mười 26, 2012 lúc 11:38 chiều

    vậy tóm lại polymorphism là gì vậy ? đọc bài của bạn tôi vẫn chưa có 1 khái niệm rõ ràng về polymorphism
    ” Tóm lại nên định nghĩa polymorphism như thế nào? Về mặt lương tâm mà nói thì có lẽ cần trình bày dựa theo lí thuyết về ngôn ngữ lập trình. Về mặt cảm giác, tôi nghĩ định nghĩa polymorphism trong OOP bằng subtype polymorphism tuy trông thì phức tạp nhưng lại đơn giản, mạch lạc, ít mơ hồ hơn định nghĩa thông qua overriding (đương nhiên kéo theo người học dễ hiểu, dễ nhớ, dễ hệ thống hơn). Về thực tế thì vì định nghĩa về polymorphism trong OOP thông qua overriding (và kéo theo hiểu rằng polymorphism là đặc trưng của OOP) đã quá phổ biến, mà hiểu sao thì tóm lại vẫn là biết lập trình, nên có lẽ cũng không cần bận tâm đến polymorphism thực sự là cái gì nữa😀 .”
    cả đoạn này bạn viết hoàn toàn vô dụng.

  4. Khách
    Tháng Tám 17, 2014 lúc 2:28 chiều

    Rất đơn giản, polymorphism (đa hình) là một khái niệm “có trước” OOP. Ví dụ khi tôi nói với mấy đữa em nghịch ngợm rằng chúng mày “biến” đi thì lập tức mỗi đữa chúng nó “biến” theo một kiểu của riêng mình. Thế thôi!

  1. No trackbacks yet.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: