Giới thiệu
Trong nội dung bài viết này, chúng ta cùng nhau tìm hiểu cách thức mà Java hỗ trợ việc thực hiện những thuật ngữ về Lập trình hướng đối tượng: (i) tính chất trừu tượng – abstraction; (ii) tính chất đa hình – polymorphism; (iii) lớp trừu tượng – abstract class; (iv) giao diện – interface.
Không giống như những ngôn ngữ lập trình khác như Java / C# / PHP, quan điểm của Python là một sự linh động hết sức có thể. Chúng ta có thể tham khảo những đặc trưng của quan điểm Python như sau (https://www.python.org/dev/peps/pep-0020/):
- Đẹp thì tốt hơn xấu.
- Rõ ràng là tốt hơn so với ngầm.
- Đơn giản là tốt hơn phức hợp.
- Phức hợp tốt hơn phức tạp.
- Bằng phẳng là tốt hơn so với lồng nhau.
- Thưa thì tốt hơn dày đặc.
- Tính dễ đọc.
- Trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc.
- Mặc dù thực tế đánh bại sự tinh khiết.
- Lỗi không bao giờ nên âm thầm vượt qua.
- Trừ khi im lặng rõ ràng.
- Trước sự mơ hồ, hãy từ chối sự cám dỗ để đoán.
- Nên có một – và tốt nhất là chỉ có một cách rõ ràng để làm điều đó.
- Mặc dù cách đó ban đầu có thể không rõ ràng trừ khi bạn là người Hà Lan.
- Bây giờ tốt hơn không bao giờ.
- Mặc dù không bao giờ thường tốt hơn * ngay * bây giờ.
- Nếu việc thực hiện khó giải thích, đó là một ý tưởng tồi.
- Nếu việc thực hiện khó giải thích, đó là một ý tưởng tồi.
- Namespaces là một ý tưởng tuyệt vời – hãy làm nhiều hơn nữa!
Đối với tính chất đa hình cũng vậy, Python xem khái niệm abstract class và interface là như nhau và dưới một sự thể hiện duy nhất là abstract class.
Như vậy chúng ta muốn phân tích và thiết kế một chương trình hướng đối tượng càng thuần túy, thì chúng ta phải phân hoạch các class dựa vào tư duy Lập trình hướng đối tượng.
Chúng ta thiết kế một chương trình nhỏ bao gồm các lớp và giao diện như sau:
- Lớp trừu tượng:
PhuongTienGiaoThong.
- Các lớp đối tượng ở tầng dưới thứ hai:
PhuongTienDuongBo;PhuongTienDuongThuy;PhuongTienDuongKhong.
- Các lớp đối tượng ở tầng dưới cùng:
Oto;XeMay;XeDap;TauThuy;Thuyen;MayBay;KhinhKhiCau;ThuyPhiCo.
- Giao diện ở cấp cao nhất:
HoatDong.
- Giao diện ở tầng dưới:
CoTheChay;CoTheBay;CoTheBoi.

Thiết kế Lớp trừu tượng
Bước 1.
Chúng ta thực hiện tạo PyDev Project trong Eclipse IDE và đặt tên là PythonOOPThirdProject.
Chúng ta thực hiện tạo package main và file Main.py.

Bước 2.
Chúng ta thực hiện tạo package object.
Chúng ta thực hiện tạo class PhuongTienGiaoThong.

Những điểm cần chú ý:
- Cách thức để định nghĩa một lớp đối tượng trong Python là kế thừa từ lớp
ABC(viết tắt củaAbstract Base Class) trongmodule abc.
Bước 3.
Chúng ta thực hiện tạo class PhuongTienDuongBo là một dẫn xuất của class PhuongTienGiaoThong.

Bước 4.
Chúng ta thực hiện tạo class PhuongTienDuongThuy là một dẫn xuất của class PhuongTienGiaoThong.

Bước 5.
Chúng ta thực hiện tạo class PhuongTienDuongKhong là một dẫn xuất của class PhuongTienGiaoThong.

Thiết kế Lớp đối tượng
Bước 1.
Chúng ta thực hiện tạo class Oto là một dẫn xuất của class PhuongTienDuongBo.

Bước 2.
Chúng ta thực hiện tạo class XeMay là một dẫn xuất của class PhuongTienDuongBo.

Bước 3.
Chúng ta thực hiện tạo class XeDap là một dẫn xuất của class PhuongTienDuongBo.

Bước 4.
Chúng ta thực hiện tạo class Thuyen là một dẫn xuất của class PhuongTienDuongThuy.

Bước 5.
Chúng ta thực hiện tạo class TauThuy là một dẫn xuất của class PhuongTienDuongThuy.

Bước 6.
Chúng ta thực hiện tạo class MayBay là một dẫn xuất của class PhuongTienDuongKhong.

Bước 7.
Chúng ta thực hiện tạo class KhinhKhiCau là một dẫn xuất của class PhuongTienDuongKhong.

Bước 8.
Chúng ta thực hiện tạo class ThuyPhiCo là một dẫn xuất của class PhuongTienGiaoThong.

Thiết kế Giao diện
Bước 1.
Chúng ta thực hiện tạo package action.
Chúng ta thực hiện tạo abstract class CoTheChay đóng vai trò như một interface.

Bước 2.
Chúng ta thực hiện tạo abstract class CoTheBoi đóng vai trò như một interface.

Bước 3.
Chúng ta thực hiện tạo abstract class CoTheBay đóng vai trò như một interface.

Bước 4.
Chúng ta thực hiện tạo abstract class HoatDong đóng vai trò như một interface, là class cơ sở của các class: CoTheChay; CoTheBay; CoTheBoi.

Thiết kế Tính đa hình thứ nhất
Bước 1.
Chúng ta đặc tả những đặc trưng của abstract class PhuongTienGiaoThong:
- Thuộc tính:
soLuongBanhXe;soLuongChoNgoi.
- Những phương thức
get/set.
- Phương thức trừu tượng:
gioiThieu().
Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienGiaoThong trên cây gia phả.

Những điểm cần chú ý:
- Chúng ta sử dụng
decorator @abstractmethodtrongmodule abcđể định nghĩa một phương thức trừu tượng.
Bước 2.
Chúng ta đặc tả những đặc trưng của class PhuongTienDuongBo:
- Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở
PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 01 thuộc tính riêng biệt:loaiDongCo.
- Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức
get/setđối với những thuộc tính được đặc tả ở lớp cơ sởPhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thứcget/setđối với thuộc tínhloaiDongCo.
- Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.
Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienDuongBo trên cây gia phả.

Bước 3.
Chúng ta đặc tả những đặc trưng của class PhuongTienDuongKhong:
- Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở
PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 02 thuộc tính riêng biệt:soLuongCanh;soLuongQuat.
- Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức
get/setđối với những thuộc tính được đặc tả ở lớp cơ sởPhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thứcget/setđối với thuộc tínhsoLuongCanh;soLuongQuat.
- Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.
Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienDuongKhong trên cây gia phả.

Bước 4.
Chúng ta đặc tả những đặc trưng của class PhuongTienDuongThuy:
- Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở
PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 01 thuộc tính riêng biệt:loaiBanhLai.
- Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức
get/setđối với những thuộc tính được đặc tả ở lớp cơ sởPhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thứcget/setđối với thuộc tínhloaiBanhLai.
- Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.
Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienDuongThuy trên cây gia phả.

Bước 5.
Chúng ta đặc tả những đặc trưng của class Oto:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongBo.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 6.
Chúng ta đặc tả những đặc trưng của class XeMay:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongBo.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 7.
Chúng ta đặc tả những đặc trưng của class XeDap:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongBo.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 8.
Chúng ta đặc tả những đặc trưng của class MayBay:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongKhong.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 9.
Chúng ta đặc tả những đặc trưng của class KhinhKhiCau:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongKhong.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 10.
Chúng ta đặc tả những đặc trưng của class TauThuy:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongThuy.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 11.
Chúng ta đặc tả những đặc trưng của class Thuyen:
- Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở
PhuongTienDuongThuy.
- Phương thức. Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 12.
Chúng ta đặc tả những đặc trưng của class ThuyPhiCo:
- Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở
PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 02 thuộc tính riêng biệt:loaiBanhLai;soLuongCanh.
- Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức
get/setđối với những thuộc tính được đặc tả ở lớp cơ sởPhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thứcget/setđối với thuộc tínhloaiBanhLai;soLuongCanh.
- Kế thừa và đặc tả lại phương thức
gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 13.
Chúng ta thực hiện thử nghiệm tính đa hình như bên dưới.
Chúng ta có thể nhận thấy những điểm rất rõ ở đây là:
- Thực thể của đối tượng nào thì sẽ tự biết mình là ai.
- Và như vậy sẽ tự thực hiện một cách chính xác phương thức
gioiThieu()cũng như các phương thứcget/setcủa các thuộc tính được đặc tả trong lớp trừu tượngPhuongTienGiaoThong.

Bước 14.
Kết quả thực hiện thử nghiệm đa hình thứ nhất như sau:

Thiết kế Tính đa hình thứ hai
Bước 1.
Chúng ta định nghĩa phương thức trừu tượng thongBao() trong class cơ sở HoatDong.

Bước 2.
Chúng ta định nghĩa class CoTheChay kế thừa từ class HoatDong:
- Kế thừa việc định nghĩa các phương thức trừu tượng từ
class HoatDong.
- Định nghĩa phương thức trừu tượng riêng biệt:
chay().

Bước 3.
Chúng ta định nghĩa class CoTheBoi kế thừa từ class HoatDong:
- Kế thừa việc định nghĩa các phương thức trừu tượng từ
class HoatDong.
- Định nghĩa phương thức trừu tượng riêng biệt:
boi().

Bước 4.
Chúng ta định nghĩa class CoTheBay kế thừa từ class HoatDong:
- Kế thừa việc định nghĩa các phương thức trừu tượng từ
class HoatDong.
- Định nghĩa phương thức trừu tượng riêng biệt:
bay().

Bước 5.
Chúng ta điều chỉnh class PhuongTienDuongBo để thuộc phạm vi ảnh hưởng của class CoTheChay:

Bước 6.
Chúng ta điều chỉnh class PhuongTienDuongThuy để thuộc phạm vi ảnh hưởng của class CoTheBoi:

Bước 7.
Chúng ta điều chỉnh class PhuongTienDuongKhong để thuộc phạm vi ảnh hưởng của class CoTheBay:

Bước 8.
Chúng ta điều chỉnh class ThuyPhiCo để thuộc phạm vi ảnh hưởng của class CoTheChay và CoTheBoi.

Bước 9.
Chúng ta điều chỉnh class Oto:

Bước 10.
Chúng ta điều chỉnh class XeMay:

Bước 11.
Chúng ta điều chỉnh class XeDap:

Bước 12.
Chúng ta điều chỉnh class MayBay:

Bước 13.
Chúng ta điều chỉnh class KhinhKhiCau:

Bước 14.
Chúng ta điều chỉnh class TauThuy:

Bước 15.
Chúng ta điều chỉnh class Thuyen:

Bước 16.
Chúng ta điều chỉnh lại ví dụ về tính đa hình như bên dưới.
Chúng ta cần kiểm tra một chút để biết thực thể của đối tượng nào bằng cách sử dụng từ khóa isinstance.

Tổng kết
Trong bài này, chúng ta đã cùng nhau tìm hiểu sự hỗ trợ của Python trong việc thực hiện tính chất đa hình trong Lập trình hướng đối tượng.
Hi vọng với bài này thì chúng ta đã có cái nhìn tổng quát hơn về cả 04 tính chất đặc trưng nhất của Lập trình hướng đối tượng.

























































































































































































