6.3.3 Ghi đè phương thức trong lớp dẫn xuất (3)

Một trong những khái niệm quan trọng nhất của lập trình hướng đối tượng là “đa hình – polymorphism“. Đây là một phương pháp để định nghĩa lại hành vi của lớp cơ sở mà không phải sửa code (còn gọi là implementation) của nó.

Từ “polymorphism” có nghĩa là cùng một lớp có thể cho cho ra nhiều biến thể, không phải được định nghĩa bởi lớp đó, mà bởi các lớp con của nó. Một định nghĩa khác nói rằng đa hình (polymorphism) là khả năng nhận ra hành vi của lớp theo nhiều cách.

Cả hai định nghĩa đều có vẻ không đủ rõ ràng và thực sự là rất khó để hình dung ra bản chất thực sự. Tóm lại cứ xem ví dụ cho dễ hiểu →

Nó gần giống như ví dụ trước. Hàm main thì khác nhau nhưng định nghĩa của các lớp gần như giống hệt nhau. Chỉ có một sự khác biệt – một từ khoá mới đã được thêm vào mã. Bạn đã phát hiện ra nó chưa ?

Yes – đó chính là “virtual“, được đặt ở phía trước của hàm thành viên MakeSound bên trong lớp Pet.

Từ này có hàm ý là nếu phương thức được định nghĩa lại (overriding) thì nó sẽ được định nghĩa lại (thay thế) ở cấp độ của lớp gốc.

Chương trình ví dụ trên sẽ xuất ra màn hình nội dung khá bất ngờ:

Kitty the Cat says: Meow! Meow!

Kitty the Cat says: Meow! Meow!

Kitty the Cat says: Meow! Meow!

Doggie the Dog says: Woof! Woof!

Doggie the Dog says: Woof! Woof!

Doggie the Dog says: Woof! Woof!

Chúng ta hãy dừng lại một chút trong hàm main. Chúng ta đã gọi phương thức MakeSound đến 6 lần: 2 lần cho các đối tượng của lớp Dog và Cat (a_doga_cat) và 4 lần cho lớp cha của chúng (a_pet1a_pet2).

Kết quả nhận được như thể hàm MakeSound được định nghĩa trong lớp Pet đã biến mất. Có vẻ như lớp Pet không phải lúc nào cũng giống nhau – bất kỳ lớp con nào của nó đều có thể làm thay đổi hành vi của nó. Nói cách khác, bạn không thể dự đoán hành vi của lớp có chứa một hàm ảo khi bạn không biết tất cả các lớp con của nó. Nó cũng có nghĩa là một số khía cạnh của lớp được định nghĩa bên ngoài lớp ==> Đó chính là tính đa hình.

Xin vui lòng không đi xa hơn cho đến khi bạn đã quen thuộc với hai ví dụ gần nhất vừa xong. Bạn nên thực hiện một số thí nghiệm của riêng mình (sửa code rồi chạy các kiểu con đà điểu xem nó thay đổi ra sao), điều đó sẽ giúp bạn có thể thực sự nắm bắt nó.