Kế thừa và đa hình trong Java
Chào các anh ạ, em có câu hỏi sau.
Giả sử em có một class Quân Cờ (Em xin phép gõ theo kiểu tiếng Việt cho dễ đọc, dễ hiểu ạ), và class Quân Xe được kế thừa từ Quân Cờ.
2 class trên đều có một method tên là Đi.
Vậy em hiểu như này có đúng không ạ:
Quân Cờ a = new Quân Cờ();
a.Đi;
//Cái này sẽ gọi method đi trong Quân Cờ.
Quân cờ b = new Quân Xe();
b.Đi;
//Cái này sẽ gọi method đi trong Quân Xe.
Vậy cách khai báo Quân cờ b = new Quân Xe(); có tác dụng gì vì nếu b chỉ sử dụng được đi trong Quân Xe thì sao không khai báo luôn là:
Quân Xe b = new Quân Xe();
mà lại dùng cách kia cho phức tạp ạ
Đúng hơn là
Quân Xe b = new Quân Cờ();
có 2 cách khai báo biến Quân Xe
Quân Xe b = new Quân Cờ();
==> vì Quân Xe “ăn bám” Quân CờBiến b CHỈ CÓ THỂ sử dụng các property, method được khai báo trong Quân Cờ (vì nó được khởi tạo từ Quân Cờ)
Quân Xe b = new Quân Xe();
==> cái này ai cũng biếtBiến b CÓ THỂ sử dụng các property, method được khai báo trong Quân Cờ VÀ trong Quân Xe vì b được khởi tạo từ Quân Xe nên có các method đã được implement tại Quân Cờ và tại Quân Xe
Anh nhầm ạ, phải là
Quân Cờ b = new Quân Xe(); chứ ạ?
Tại mình hay code như vậy Để chống bug thôi
Hình như có gì đó không đúng ở đây
Cái này gọi là tính đa hình (Polymorphism) trong OOP. Tác dụng của nó là giúp
b
được hệ thống coi như là 1Quân Cờ
nhưng nó lại có những tính chất củaQuân Xe
. Bạn có thể đọc thêm về tác dụng của tính đa hình tại đây:Bạn có nhầm lẫn ở đâu không.
Quân xe
có thể được coi là mộtQuân cờ
nhưng màQuân cờ
không thể được coi là 1Quân xe
nhé Nếu bạn khai báo như vậy sẽ có bug ngay nhé Chứ không phải chống bug đâu…
Quay lại câu hỏi của chủ thớt, nếu như biến b không bị gán lại thì đúng là không cần khai báo như thế, tuy nhiên nếu trong hàm hoặc đối tượng, khi thực hiện công việc nào đó mà người ta muốn gán b = new Quân Mã(); thì làm thế nào?
Vì b có kiểu dữ liệu là Quân Cờ do bạn khai báo ở trên nên nó có thể gán vào lớp con bất kỳ của Quân Cờ, chứ nếu bạn gọi Quân Xe b = new Quân Xe(); từ đầu thì bạn không thể gán b cho một loại quân nào khác ngoài Quân Xe
Và nó cũng giúp cho code của bạn ngắn hơn, có thể cái này không đúng luật cờ vua, nhưng bạn có một việc gì đó muốn nhiều đối tượng cùng làm, hoặc một đối tượng làm nhưng không biết chính xác nó là đối tượng gì, mỗi đối tượng làm một kiểu nhưng công việc này là một hàm có kế thừa:
Như vậy tất cả các quân cờ sẽ đi, dù là mỗi thằng đi 1 kiểu.
Nhưng có cái bàn cờ vẫn tự nhiên hơn.