Java Bài 30: Đa Hình (Polymorphism) – YellowCode.Books

Chào mừng các bạn đã đến với bài học Java số 30. Bài học về tính đa hình (polymorphism). Đây là bài học trong chuỗi bài viết về lập trình ngôn ngữ Java của Yellow Code Books.

Bài hôm nay chúng ta sẽ nói sâu về tính Đa hình trong Java. Nghe qua đặc tính này thì có vẻ khó. Một phần vì ứng dụng của chúng không nhiều. Với cái tên nghe chẳng có cố định gì cả, như là biến hình gì gì đó. Cộng với khá ít tài liệu viết rõ về công năng này của OOP.



Vậy thì chúng ta cùng đi sâu vào bài học để xem Đa hình là gì và nó có thực sự khó không nhé.

Tính Đa Hình (Polymorphism) Là Gì?

Lần này thì nghĩa tiếng Anh và tiếng Việt trong lập trình Java lại khớp với nhau. Không nhiều các từ lan man, chỉ có Đa hình, hoặc Polymorphism mà thôi.

Vậy tại sao lại Đa hình? Như bạn biết, vốn dĩ OOP là một cách thức tư duy lập trình hướng thực tế, nên hiển nhiên các khái niệm của nó cũng phải sát với các đặc điểm trong thực tế. Trong đó có Đa hình. Trong thực tế, sự Đa hình được xem như một đối tượng đặc biệt, có lúc đối tượng này mang một hình dạng (trở thành một đối tượng) nào đó, và cũng có lúc đối tượng này lại mang một hình dạng khác nữa, tùy vào từng hoàn cảnh. Sự “nhập vai” vào các hình dạng (đối tượng) khác nhau này giúp cho đối tượng Đa hình ban đầu có thể thực hiện những hành động khác nhau của từng đối tượng cụ thể. Chẳng hạn nếu ở công ty bạn, có nhân viên nhận hai trách nhiệm khác nhau, họ vừa là nhân viên toàn thời gian ở các ngày trong tuần, nhưng làm bán thời gian ở các ngày cuối tuần. Vậy thì, để tính lương cho nhân viên này, tùy vào từng thời điểm mà hệ thống sẽ xem nhân viên đó là toàn thời gian hay bán thời gian, và phương thức tính lương của mỗi loại nhân viên sẽ thực hiện tính toán một cách hiệu quả nhất dựa vào từng vai trò khác nhau này. Bạn cũng hiểu sơ sơ về Đa hình rồi đúng không nào.

Có một điều chắc chắn rằng. Nếu như không xem hành động tính lương của nhân viên như ví dụ trên kia là Đa hình, thì chúng ta vẫn cứ xây dựng được một hệ thống tính lương hoàn chỉnh, nhưng sẽ phức tạp hơn là nếu bạn biết kiến thức về Đa hình là gì.

Và còn một ý nữa. Rằng tính Đa hình của bài hôm nay cũng là một trong các đặc tính nổi trội mà OOP mang lại đấy nhé. Bạn cố gắng nắm bắt và tận dụng. Ôn lại một tí các đặc tính cốt lõi của OOP bao gồm:

– Tính Gói ghém dữ liệu (Encapsulation). Tính chất này được thể hiện qua các kiến thức về khả năng truy cập, getter/setter. – Tính Kế thừa (Inheritance). Tính chất này được thể hiện qua các kiến thức về kế thừa, overriding, overloading. – Tính Đa hình (Polymorphism). Bài hôm nay chúng ta sẽ học. – Tính Trừu tượng (Abstraction). Bài sau chúng ta sẽ học.

Sử Dụng Tính Đa Hình Như Thế Nào?

Đến đây chắc chắn bạn đã hiểu sơ bộ khái niệm Đa hình. Vậy thì trong OOP chúng ta tổ chức và sử dụng đặc tính Đa hình này như thế nào?

Thứ nhất, Đa hình sẽ gắn liền với kế thừa. Và, Đa hình cũng sẽ gắn liền với ghi đè phương thức (overriding) nữa. Bởi vì như trên đây có nói đó, Đa hình là nói đến một đối tượng nào đó có khả năng nhập vai thành các đối tượng khác. Vậy thì để mà một đối tượng có thể là một đối tượng nào đó, ắt hẳn nó phải là đối tượng cha. Và để đối tượng cha có thể là một trong các đối tượng con ở từng hoàn cảnh, thì nó phải định nghĩa ra các phương thức để con của nó có thể ghi đè. Điều này giúp hệ thống xác định được đối tượng nào và phương thức nào thực sự đang hoạt động khi ứng dụng đang chạy. Nên nhiều tài liệu gọi Đa hình này là Đa hình tại runtime là vậy.

Chúng ta sẽ đến ví dụ sau cho dễ hiểu hơn. Ví dụ khá đơn giản. Lớp HinhHoc là lớp cha, hai lớp con HinhTronHinhChuNhat đều override phương thức tinhDienTich() từ cha.

Đa hình - Sơ đồ lớp ví dụ

Code của chúng cũng khá đơn giản, chúng ta loại bỏ hết tất cả các râu ria khác, chỉ tập trung vào các phương thức override mà thôi.

HinhHoc

HinhTron

HinhChuNhat

Nào, sự diệu kỳ của tính Đa hình là đây, bạn hãy chú ý vào đoạn code khai báo và sử dụng các phương thức được overriding trên kia như sau.

MainClass

Bạn đã thấy đó, đối tượng HinhHoc bản thân nó có một phương thức tinhDienTich(). Nhưng khác với cách sử dụng các đối tượng từ các bài học từ trước đến giờ, rằng mỗi khi cần đến các lớp con thực hiện việc tính diện tích, chúng ta sẽ khai báo lớp con và gọi phương thức được override ở lớp con. Thì bài hôm nay chúng ta cho phép lớp HinhHoc có khả năng đóng vai trò là lớp con, bằng cách khởi tạo lại đối tượng là lớp con của nó, HinhHoc hinhHoc = new HinhTron(), rồi chính nó sẽ đóng vai là lớp con đó. Tính Đa hình là đây.

Đa hình là vậy, bạn có thấy khó không nào. Sẽ còn kiến thức có liên quan đến Đa hình nữa, như ép kiểu trong OOP chẳng hạn, mà chúng ta sẽ nói ở bài học sau.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy đánh giá 5 sao nếu thấy thích bài viết, hãy comment bên dưới nếu có thắc mắc, hãy để lại địa chỉ email của bạn để nhận được thông báo mới nhất khi có bài viết mới, và nhớ chia sẻ các bài viết của Yellow Code Books đến nhiều người khác nữa nhé.

Bài Kế Tiếp

Chúng ta đã biết đến ép kiểu đối với kiểu dữ liệu nguyên thủy rồi đúng không nào. Vậy thì ép kiểu với các đối tượng OOP có gì khác không. Bài sau chúng ta cùng tìm hiểu nhé.