2012-04-19 46 views
37

Trong java khi một giao diện mở rộng giao diện khác:Giao diện mở rộng giao diện khác nhưng thực hiện phương pháp của nó

  1. Tại sao nó thực hiện các phương pháp của nó? Làm thế nào nó có thể thực hiện các phương pháp khi nó mở rộng giao diện khác và không thực hiện nó?
  2. Mục đích của giao diện triển khai giao diện khác là gì?

Điều này có các khái niệm chính trong Java!

EDIT:

public interface FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 
} 


public interface DragController extends FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 

    void dragEnd(); 

    void dragMove(); 
} 

Trong nhật thực có là dấu hiệu thực hiện bên cạnh những phương pháp thực hiện trong DragController.

Và khi tôi di chuột qua nó, nó nói rằng nó thực hiện phương pháp !!!

+3

khi bạn mở rộng một giao diện bạn chỉ có thể thêm vào đó, đây là lý do tại sao bạn làm điều đó. Giao diện không thực hiện các phương thức. –

+4

Tôi không nhận được downvote. . . – GingerHead

Trả lời

45

Tại sao nó triển khai các phương pháp của nó? Làm thế nào nó có thể thực hiện các phương thức của nó khi một giao diện không thể chứa thân phương thức? Làm thế nào nó có thể thực hiện các phương pháp khi nó mở rộng giao diện khác và không thực hiện nó? Điều gì là mục đích của một giao diện thực hiện một giao diện khác?

Giao diện không triển khai các phương thức của giao diện khác mà chỉ mở rộng chúng. Một ví dụ cần mở rộng giao diện là: xem xét bạn có giao diện xe với hai phương pháp moveForwardmoveBack nhưng bạn cũng cần phải kết hợp Máy bay là phương tiện nhưng với một số phương pháp bổ sung như moveUp, moveDown sao cho cuối cùng bạn có:

public interface IVehicle { 
    bool moveForward(int x); 
    bool moveBack(int x); 
}; 

và máy bay:

public interface IAirplane extends IVehicle { 
    bool moveDown(int x); 
    bool moveUp(int x); 
}; 
+0

Vì vậy, về cơ bản bạn đang tích lũy các phương thức vào một nơi gọi là 'IAirplane' và bạn thực sự không kế thừa. Một điểm khác là, tôi sẽ yêu cầu tác giả của 'IVehicle' hiểu, tại sao giao diện này 'Ivehicle' không được thiết kế để xem xét' moveDown() 'và' moveBack() ', bởi vì' giao diện' được phát hiện từ tập hợp hiện tại của các lớp bê tông (Tôi cho rằng khái niệm máy bay có sẵn như là một phần của thế hệ của mình). Nhìn chung, tôi cảm thấy, việc mở rộng một giao diện là kết quả của thiết kế xấu hiện có, Bởi vì chúng ta đang phá vỡ mục đích của 'mở rộng' trong kịch bản này. – overexchange

+0

@overexchange không có giao diện nào trong trường hợp này được thiết kế trước các lớp học. Giao diện mô tả một chức năng tuy nhiên các lớp đại diện cho các đối tượng thế giới thực. Đây là sự khác biệt chính giữa các lớp và các giao diện. Không liên quan đến moveUp moveDown và v.v. Bất kỳ chiếc xe nào cũng có thể di chuyển về phía trước và phía sau nhưng không phải tất cả chúng có thể di chuyển lên và xuống. Máy bay có thể di chuyển về phía trước và cũng lên xuống nhưng các loại máy bay khác nhau sẽ thực hiện theo một cách khác. – AlexTheo

+0

tôi đã không nhận được bạn khi bạn nói: 'giao diện trong trường hợp này được thiết kế trước khi các lớp học. 'Trong mọi trường hợp của bất kỳ thiết kế phần mềm, giao diện được phát hiện sau khi các lớp bê tông được thiết kế. – overexchange

6

quảng cáo 1. Nó không thực hiện các phương pháp của nó.

quảng cáo 4. Mục đích của một giao diện mở rộng, không triển khai khác, là tạo giao diện cụ thể hơn. Ví dụ: SortedMap là giao diện mở rộng Map. Máy khách không quan tâm đến khía cạnh sắp xếp có thể mã hóa với Map và xử lý tất cả các trường hợp ví dụ TreeMap, thực hiện SortedMap. Đồng thời, một ứng dụng khách quan tâm đến khía cạnh được sắp xếp có thể sử dụng cùng các phiên bản đó thông qua giao diện SortedMap.

Trong ví dụ của bạn, bạn đang lặp lại các phương thức từ siêu liên kết. Trong khi hợp pháp, nó không cần thiết và không thay đổi bất cứ điều gì trong kết quả cuối cùng. Mã được biên dịch sẽ là giống hệt nhau cho dù các phương pháp này có hay không. Bất kể di chuột của Eclipse nói gì là không liên quan đến sự thật cơ bản mà một giao diện không thực hiện bất cứ điều gì.

18

Giao diện xác định hành vi. Ví dụ: giao diện Vehicle có thể xác định phương thức move().

Xe ô tô là phương tiện nhưng có hành vi bổ sung. Ví dụ: giao diện Car có thể xác định phương thức startEngine(). Vì ô tô cũng là phương tiện, giao diện Car mở rộng giao diện Vehicle và do đó xác định hai phương pháp: move() (được kế thừa) và startEngine().

Giao diện ô tô không có bất kỳ triển khai phương pháp nào. Nếu bạn tạo một lớp (Volkswagen) triển khai ô tô, nó sẽ phải cung cấp triển khai cho tất cả các phương thức của giao diện của nó: move()startEngine().

Giao diện không thể triển khai bất kỳ giao diện nào khác. Nó chỉ có thể mở rộng nó.

+2

Tôi đã trả lời chúng. 3 câu hỏi đầu tiên không có ý nghĩa, vì giao diện không thực hiện giao diện khác và không chứa bất kỳ triển khai phương thức nào. Câu hỏi thứ 4 được trả lời bởi câu trả lời của tôi: nó cho phép cung cấp các hành vi/phương pháp bổ sung. –

+2

Tôi sẽ mô tả nó như một lỗi nhỏ của Eclipse. Không có điểm trong việc redeclaring các phương thức trong giao diện DragController, ngoại trừ nếu bạn muốn cung cấp thêm javadoc. –

Các vấn đề liên quan