2011-06-29 36 views
5

Tôi có một phương pháp, trong một lớp được gọi là "PlaceParser" mà extends "ModelParser":Java: Overriding hoặc Overloading method?

protected Place parseModel(JSONObject element) ... 

Một Place là một lớp con của Mẫu. Chú thích @Override có được thêm vào mã trên không? Vì phương thức có kiểu trả về khác nhau, điều này vẫn được tính là ghi đè phương thức lớp cơ sở có cùng tên và đối số/kiểu trả về có thay đổi 'chữ ký' không?

Phương pháp "ModelParser" trông như thế này "ModelT" cũng mở rộng "Model":

protected abstract ModelT parseModel(JSONObject element) 
      throws JSONException; 

Cập nhật @ Jon Skeet: lớp

Các cơ sở được khai báo như thế này:

public abstract class ModelParser<ModelT extends Model> { 

Tôi chưa thấy <ModelT extends Model> kiểu khai báo cho một lớp trước.

+0

Xem http://stackoverflow.com/questions/1882584/what-is-a-covariant-return-type. (Không * chính xác * trường hợp của bạn, bởi vì 'Place' không mở rộng' ModelT'.) –

+0

@Eli: Tôi nghi ngờ rằng Place thực sự mở rộng ModelT, nếu không mã này sẽ không biên dịch. (Hoặc ModelT là một tham số kiểu chung ...) –

+0

@Jon: Tôi đã cập nhật câu hỏi - tôi sẽ rất biết ơn nếu bạn có thể giải thích mối quan hệ giữa 'ModelT' và' Place'. – Mikaveli

Trả lời

6

Có, bạn nên thêm @Override, vì bạn vẫn ghi đè phương pháp. Thực tế là bạn đang sử dụng hiệp phương sai của các loại trả về không thay đổi điều đó.

Đặc biệt, nếu các mã khác có một biểu hiện của loại ModelParser và gọi parseModel(element) họ sẽ vẫn kết thúc polymorphically trong thực hiện của bạn. So sánh với việc quá tải (ví dụ: bằng cách thêm thông số khác), nơi triển khai ban đầu trong ModelParser sẽ được gọi.

3

OVERLOADING Java, cùng với một số ngôn ngữ lập trình, cho phép bạn sử dụng lại tên phương thức để có thêm một phương thức. Trong một số trường hợp, bạn có thể muốn viết một số phương thức trong cùng một lớp thực hiện cùng một công việc với các đối số khác nhau. Khi bạn viết mã để gọi một phương thức, phương thức thích hợp được chọn theo loại đối số hoặc đối số mà bạn cung cấp. Hai quy tắc áp dụng cho các phương thức quá tải:

  1. Kiểu trả về của phương thức có thể khác, nhưng danh sách đối số của phương thức quá tải phải khác nhau.
  2. Danh sách đối số của câu lệnh gọi phải đủ khác nhau để cho phép xác định rõ ràng phương thức thích hợp để gọi.

trọng Trong hệ thống phân cấp lớp, khi một phương pháp trong một lớp học phụ có cùng tên và kiểu chữ ký như phương pháp trong lớp cha, sau đó phương pháp trong lớp con được cho là ghi đè lên các phương pháp trong lớp cha. Các phương thức trong lớp dẫn xuất có thể có cùng tên với lớp cơ sở. Nếu bạn đang có một lớp cơ sở được gọi là book và lớp dẫn xuất được gọi là book1 và book2 và nếu bạn sử dụng cùng một phương thức trong cả ba lớp, thì phương thức lớp dẫn xuất cuối cùng được thực thi mặc dù có các phương thức có tên tương tự trong tất cả các lớp cũ. Khái niệm trong Java được gọi là Overriding.

3

1) Sự khác biệt đầu tiên và quan trọng nhất giữa quá tải và ghi đè phương thức là, Trong trường hợp quá tải phương thức trong Java, chữ ký thay đổi phương thức trong trường hợp phương pháp ghi đè vẫn giữ nguyên.

2) Khác biệt lớn thứ hai giữa quá tải phương thức so với ghi đè trong Java là bạn có thể quá tải phương thức trong một lớp nhưng ghi đè chỉ có thể được thực hiện trên lớp con.

3) Bạn không thể ghi đè phương thức tĩnh, cuối cùng và riêng tư trong Java nhưng bạn có thể quá tải phương thức tĩnh, cuối cùng hoặc riêng tư trong Java.

4) Phương pháp quá tải trong Java được liên kết bằng các ràng buộc tĩnh và các phương thức ghi đè có thể bị ràng buộc động.

5) Phương thức riêng tư và cuối cùng cũng có thể không được ghi đè trong Java. enter image description here

Read more: http://javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z