Chương 7: Thừakế và giao tiếp Mục tiêu bài học:
7.2 Hiệp biến kiểu trả về (Covariant Return Types)
Nét mới trong J2SE 5.0 là nó cho phép một phương thức ghi đè, trả về một đối tượng có kiểu là 1 lớp con của kiểu được trả về của phương thức bị ghi đè ở lớp cha. Đây gọi là hiệp biến kiểu trả về. Ưu điểm chính của hiệp biến kiểu trả về là nó giảm ép kiểu và kiểm tra kiểu.Ví dụ, xem lớp cha có tên là Student cài đặt 2 phương thức có tên getMarks(). Một phương thức trả về 1 thể hiện của lớp java.lang.Number và lớp kia trả về lớp java.lang.Integer như trong Đoạn mã nguồn 2.
Đoạn mã 2:
class Student {
public Number getMarks(){
return new Number();//Trả về đối tượng của lớp Number }
public Integer getMarks(){
return new Integer();//Trả về đối tượng lớp Integer }
}
Theo đoạn mã trên khi biên dịch lớp này sẽ nhận được kết quả lỗi như sau:
Student.Java:6: getMarks() is already defined in Student public Integer getMarks(){
^
Lý do của lỗi này là nếu một lớp gọi phương thức getMarks() trong lớp Student
trình biên dịch sẽ khơng biết nó nên gọi phương thức nào trong hai phương thức. Vì số nguyên (Integer) là lớp con của lớp Number, một trong hai phiên bản của phương thức có thể được gọi đúng .
Bây giờ xem lớp cha Student có một cài đặt đơn của phương thức getMarks(). Xem lớp con có tên ExchangeStudent ghi đè cùng phương thức getMarks()
nhưng trả về đối tượng có kiểu Integer là kiểu con của lớp Number. Nếu đoạn
mã 3 được biên dịch trong JDK phiên bản trước J2SE 5.0 sẽ xảy ra lỗi .Tuy nhiên, nó biên dịch thành cơng trong J2SE 5.0 JDK.
Đoạn mã 3:
class Student {
public Number getMarks(){
Chương 7 Thừa kế và giao tiếp
89/114
} }
class ExchangeStudent extends Student{ public Integer getMarks(){
return new Integer();//Trả về đối tượng của lớp Integer }
}
Chú thích của ND: Ví dụ trên chỉ mang tính minh họa, khơng dịch được vì Number là lớp Abstract, hàm dựng của Integer khơng đúng. Ngồi ra trong bản chính cịn thiếu việc thừa kế lớp Student.