2010-08-20 46 views
43

Trong Java để thực hiện nhiều thừa kế, chúng tôi sử dụng giao diện. Có phải nó là sử dụng duy nhất của giao diện? Nếu có, việc sử dụng giao diện chính trong Java là gì? Tại sao chúng ta cần giao diện trong Java?Tại sao chúng ta cần giao diện trong Java?

+2

thể trùng lặp của [Tại sao chúng tôi đang thực hiện giao diện?] (http://stackoverflow.com/questions/1583654/why-we-are-implementing-interfaces) – Thilo

+0

Cũng là một lời giải thích tốt [ở đây] (http://programmers.stackexchange.com/a/ 131334/146150). –

Trả lời

40

Tôi muốn nói việc sử dụng chính là đa hình hoặc khả năng thực hiện cùng một thao tác trên một số đối tượng khác nhau. Nếu các đối tượng khác nhau thực hiện cùng một giao diện và có cùng phương thức, bạn có thể lưu trữ tất cả các đối tượng đó trong một Vector, ví dụ, và lặp qua Vector gọi phương thức đó trên mỗi phương thức.

+2

Rob Tôi đồng ý với bạn nhưng tôi sẽ thêm điều đó bằng cách tách khái niệm thực hiện giao diện khỏi phần mở rộng lớp (mà thực sự xung đột trong C++), bạn có thể có đa hình mà không có nhiều thừa kế – Sindico

5

Bạn cần chúng để bạn có thể nhập các đối tượng của mình bên ngoài cấu trúc phân cấp.

Ví dụ, các đối tượng có thể được so sánh có thể được khá nhiều bất cứ nơi nào trên hệ thống phân cấp đối tượng - họ không cần phải có một tổ tiên chung có thể được so sánh. String s có thể so sánh, có thể so sánh Integer s, thậm chí bạn có thể tự làm cho mình có thể so sánh (ví dụ: khung hình "ít" hơn khung khác nếu nó ở phía trước hơn - tức là nếu nó phủ lên khung khác). Vì vậy, nếu bạn muốn tham chiếu đến một thứ có thể so sánh, bạn sẽ bị buộc phải khai báo một biến với tổ tiên chung nhất - trong trường hợp này là Object. Điều này là quá chung chung, bởi vì sau đó nó cũng có thể nhận được các giá trị mà không thể so sánh (và sẽ ném lỗi khi bạn cố gắng so sánh chúng).

Do đó, giao diện Comparable: nó chọn tất cả các lớp thực hiện chức năng so sánh qua số phân cấp phân lớp lớp con.

13

Ngoài những phản hồi này, tôi sẽ nói việc sử dụng quan trọng nhất đối với giao diện là giảm sự ghép nối giữa các thành phần trong phần mềm của bạn.

Giao diện cho phép biểu diễn thỏa thuận giữa các lớp về cách chúng sẽ trao đổi với nhau mà không bị ràng buộc với việc triển khai thực tế.

Điều này cho phép chúng tôi thay thế triển khai của người khác (rất hữu ích để thử nghiệm hoặc thay đổi trường hợp sử dụng) mà không thay đổi mã được biên dịch.

-1

Một số mã sẽ không biên dịch nếu thiếu.

Ví dụ, trong:

for (String name : list) 
{ 
    System.out.print("\nIn foreach loop: name: " + name); 
} 

list phải thực hiện java.lang.Iterable interface.

+5

Điều này cơ bản giống như nói rằng bạn cần sử dụng phải. Điều này không ** đầy đủ ** trả lời câu hỏi. – rayryeng

+0

Tôi biết điều đó. Tôi chỉ đơn giản chỉ ra rằng chúng ta phải sử dụng chúng trong trường hợp này, cho dù chúng ta có thích hay không. Tôi muốn nghĩ về nó tương tự như lắp ráp một P.C .: Nếu không có một số sự phù hợp giữa các kết nối phần cứng, thay thế một phần như một nguồn cung cấp điện hoặc đĩa cứng sẽ khó khăn hơn nhiều nếu chúng không hoán đổi cho nhau. Nếu điều này không trả lời đầy đủ câu hỏi, tôi thích nghĩ rằng ít nhất nó giúp mọi người hiểu tại sao họ sử dụng. –

27

Tôi cũng đã suy nghĩ về cách giao diện được sử dụng. Tôi hy vọng điều này sẽ giúp những người khác:

Giao diện là một hợp đồng (hoặc một giao thức hoặc một sự hiểu biết chung) về những gì lớp học có thể làm. Khi một lớp thực hiện một giao diện nhất định, nó hứa hẹn sẽ cung cấp cho tất cả các phương thức trừu tượng được khai báo trong giao diện. Giao diện xác định tập hợp các hành vi phổ biến . Các lớp thực hiện giao diện đồng ý với các hành vi này và cung cấp việc thực hiện của riêng chúng cho các hành vi. Điều này cho phép bạn lập trình tại giao diện, thay vì thực thi thực tế. Một trong những cách sử dụng chính của giao diện là cung cấp một hợp đồng giao tiếp giữa hai đối tượng.Nếu bạn biết một lớp thực hiện một giao diện, thì bạn biết rằng lớp đó chứa triển khai cụ thể của các phương thức được khai báo trong giao diện đó và bạn được bảo đảm để có thể gọi các phương thức này một cách an toàn. Nói cách khác, hai đối tượng có thể giao tiếp dựa trên hợp đồng được xác định trong giao diện , thay vì triển khai cụ thể của chúng.

Thứ hai, Java không hỗ trợ đa kế thừa (trong khi C++ không). Nhiều thừa kế cho phép bạn lấy được một lớp con từ nhiều hơn so với một lớp cha trực tiếp. Điều này đặt ra vấn đề nếu hai trực tiếp các lớp siêu hạng có triển khai xung đột. (Làm cái nào để theo dõi trong lớp con?). Tuy nhiên, nhiều thừa kế không có vị trí của nó. Java thực hiện điều này bằng cách cho phép bạn "triển khai" nhiều hơn một giao diện (nhưng bạn chỉ có thể "mở rộng" từ một siêu lớp đơn). Vì các giao diện chỉ chứa các phương thức trừu tượng mà không thực hiện thực tế, không có xung đột nào có thể nảy sinh giữa nhiều giao diện. (Giao diện có thể chứa các hằng số nhưng không được khuyến khích Nếu một lớp con thực hiện hai giao diện với các hằng số mâu thuẫn, trình biên dịch chí cờ ra một lỗi biên dịch..)

từ: http://www.ntu.edu.sg/home/ehchua/programming/java/J3b_OOPInheritancePolymorphism.html#zz-6.6

+0

Mục đích của 'Giao diện có thể so sánh' được ghi lại trong câu trả lời của bạn? – overexchange

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