Kế thừa trong Class của Java, cách khai báo này có ý nghĩa gì ạ?
//Em đã post câu hỏi này trưa nay nhưng chưa có câu trả lời nào làm em hiểu và đi đúng trọng tâm câu hỏi của em ạ. Em xin phép hỏi lại cho rõ
Em có 2 class, Flight và CargoFlight (CargoFlight kế thừa từ Flight).
CargoFlight có 1 phương thức là addCargo.
Em đọc trên mạng thì có một cách khai báo như sau:
Flight f = new CargoFlight();
Và với cách khai báo này thì không thể dùng được f.addCargo
hay nói cách khác là không dùng được bất kì hàm nào của lớp CargoFlight, nhưng lại dùng được mọi phương thức có trong class Flight.
Vậy thì cách khai báo trên có ý nghĩa gì ạ, đằng nào cũng không dùng được phương thức nào ở lớp
CargoFlight mà chỉ dùng được phương thức ở lớp Flight sao không khai báo luôn như này cho nhanh:
Flight f = new Flight();
mà phải khai báo kiểu trên làm gì cho khó hiểu ạ?
Hỏi lại thì cũng không tạo topic mới nhé =_= Mà bạn không hiểu chỗ nào mới được ?
Em không hiểu là với việc khai báo
Flight f = new CargoFlight()
; thì f chỉ có thể dùng được phương thức ở lớp Flight vậy sao không khai báo như này cho nhanh, cũng chỉ dùng được phương thức ở lớp Flight.Flight f = new Flight();
Flight f = new CargoFlight();
khai báo kiểu này cho phép bạn tạo 1 mảng gồm cả
Flight
vàCargoFlight
, nếu ko khai báo kiểu này được thì làm sao bạn tạo 1 mảng bao gồm ví dụ[Flight, CargoFlight, Flight]
? Kiểu của mảng đó là gì?Flight_CargoFlight[3] arr
??nhờ kế thừa, object của class con có thể được xem như là object của class cha, nên bạn có thể tạo mảng
Flight[3] arr
rồi gánFlight
,CargoFlight
,Flight
vàoarr
. Mảngarr
lúc này chứa 3 đối tượng, 3 đối tượng này có kiểu là 2 class khác nhau (Flight và CargoFlight)công dụng gộp chung object của các class khác nhau vào 1 mảng này chỉ là 1 cộng dụng nhỏ.
kế thừa chả có nghĩa lý gì cả ngoại trừ đỡ mất công copy paste code, đa hình mới làm cho nó có ý nghĩa. Mặc dù
arr[0]
,arr[1]
,arr[2]
đều là kiểuFlight
, nhưng ví dụ gọiarr[i].getTypeName()
thi với i = 0, 2 nó trả về “flight”, còn i = 1 nó trả về “cargo flight”. 3 object cùng 1 kiểu nhưng khi gọi cùng phương thức nó hành động khác nhau. Điều này rất có ích khi bạn muốn viết code mà ko cần chỉnh sửa vẫn có thể mở rộng nó ra được. Ví dụ nếu bạn có 1 class khác có 1 phương thức check in cho các chuyến bay:nếu ko có đa hình, để check in các chuyến bay f có kiểu là
Flight
thì ko có vấn đề gì, nhưng nếu f có kiểu làCargoFlight
thì bây giờ bạn phải viết thêm 1 phương thức mớiđiều này rất bất tiện, mỗi khi có kiểu bay mới bạn lại phải vào
Boarding.java
thêm sửa phương thức, phải compile lại Boarding từ đầu, mất thời gian.thay vào đó, nhờ đa hình mà
CargoFlight
có thể được xem như làFlight
, và mặc dù code checkIn 2 kiểu khác nhau, bạn có thể tạo phương thức mới chung cho 2 kiểu, ví dụ làcheck()
tùy vào
f
là kiểu Flight hay CargoFlight, nó sẽ gọi đúng phương thứccheck1() check2()
haycheckA() checkB()
. Mặc dù f3 được xem như là kiểuFlight
, ko cócheck1 check2
nhưng vãn gọi được 2 phương thức này thông quacheck()
, nhờ có đa hình gọi đúng phương thức check của CargoFlight thay vì check của Flight. Như vậy class Boarding chỉ cần viết 1 lần rồi ko chỉnh sửa nó nữa, mỗi lần cần thêm kiểu bay mới chỉ cần kế thừaFlight
và override phương thứccheck()
là Boarding sẽ nhậncheckIn()
cho kiểu bay mới đó.Cám ơn anh nhiều lắm ạ
Cám ơn anh ạ
Hi tntxtnt.
Không có kế thừa thì không có đa hình.