2010-10-13 38 views
84

Những gì tôi có nghĩa là:Tại sao giao diện không thể triển khai giao diện khác?

interface B {...} 

interface A extends B {...} // allowed 

interface A implements B {...} // not allowed 

Tôi googled nó và tôi thấy this:

implements biểu thị xác định một thực hiện cho các phương pháp của một giao diện. Tuy nhiên các giao diện không có triển khai nào nên điều đó là không thể.

Tuy nhiên, giao diện là lớp trừu tượng 100% và lớp trừu tượng có thể triển khai giao diện (100% lớp trừu tượng) mà không triển khai phương pháp của nó. Vấn đề gì khi nó được định nghĩa là "giao diện"?

Cụ thể,

interface A { 
    void methodA(); 
} 

abstract class B implements A {} // we may not implement methodA() but allowed 

class C extends B { 
    void methodA(){} 
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B 

Trả lời

90

implements nghĩa thực hiện, khi interface có nghĩa là để tuyên bố chỉ để cung cấp interface không thực hiện.

A 100% abstract class có chức năng tương đương với interface nhưng cũng có thể thực hiện nếu bạn muốn (trong trường hợp này nó sẽ không còn 100% abstract), do đó, từ quan điểm của JVM chúng là những thứ khác nhau.

Ngoài ra biến thành viên trong lớp trừu tượng 100% có thể có bất kỳ trình độ truy cập nào, ở đâu trong giao diện, chúng hoàn toàn là public static final.

+4

Tính đến Java 8, giao diện có thể có phương pháp mặc định, làm cho chúng nhiều hơn nữa tương tự như lớp trừu tượng trong đó tôn trọng. – forresthopkinsa

+0

Cảm ơn câu cuối cùng! –

22

implements nghĩa là hành vi sẽ được xác định cho phương thức abstract (ngoại trừ các lớp trừu tượng rõ ràng), bạn xác định việc triển khai.

extends có nghĩa là hành vi được kế thừa.

Với giao diện có thể nói rằng một giao diện phải có cùng hành vi với một giao diện khác, thậm chí không có triển khai thực tế. Đó là lý do tại sao nó có ý nghĩa hơn đối với một giao diện để extends một giao diện khác thay vì thực hiện nó.


Trên một mặt lưu ý, hãy nhớ rằng ngay cả khi một lớp abstract có thể định nghĩa abstract phương pháp (cách lành mạnh một giao diện nào), nó vẫn là một lớp và vẫn phải được thừa hưởng (mở rộng) và không thực hiện.

4

Khái niệm có hai lớp và giao diện "miền". Bên trong các tên miền này, bạn luôn mở rộng, chỉ có một lớp thực hiện một giao diện, đó là loại "băng qua biên giới". Vì vậy, về cơ bản "mở rộng" cho các giao diện phản ánh hành vi của các lớp. Ít nhất tôi nghĩ đây là logic đằng sau. Dường như không phải tất cả mọi người đều đồng ý với loại logic này (tôi thấy nó hơi tự mình), và trên thực tế không có lý do kỹ thuật nào để có hai từ khóa khác nhau.

+0

Nếu "Y mở rộng X" và không được niêm phong, thì có thể có một loại "Z" khác mở rộng "Y". Điều đó sẽ đúng nếu X là một giao diện hay một lớp. Tuy nhiên, nếu "W thực thi X" thì không thể có "V thực hiện W". Thực tế là "mở rộng" có thể được "chuỗi" và "thực hiện" có thể không có vẻ giống như một lý do chính đáng để có các từ khóa khác nhau. – supercat

-5

Giao diện là lớp chứa phương pháp trừu tượng không thể tạo bất kỳ đối tượng nào.Vì giao diện không thể tạo đối tượng và không phải là lớp thuần túy, nó không có giá trị khi triển khai nó.

2

Tuy nhiên, giao diện là 100% lớp trừu tượng và lớp trừu tượng có thể cụ giao diện (100% lớp trừu tượng) mà không thực hiện phương thức của nó. Vấn đề gì khi nó được định nghĩa là "giao diện"?

Đây chỉ đơn giản là vấn đề về quy ước. Các nhà văn của ngôn ngữ java quyết định rằng "mở rộng" là cách tốt nhất để mô tả mối quan hệ này, vì vậy đó là những gì chúng ta đều sử dụng.

Nói chung, mặc dù giao diện là "một lớp trừu tượng 100%", chúng tôi không nghĩ về chúng theo cách đó. Chúng ta thường nghĩ về các giao diện như một lời hứa để thực hiện một số phương thức quan trọng hơn là một lớp để lấy được từ đó. Và vì vậy chúng tôi có xu hướng sử dụng ngôn ngữ khác cho giao diện hơn là cho các lớp học.

Khi những quốc gia khác nêu rõ, có những lý do chính đáng để chọn "kéo dài" qua "triển khai".

+0

Yessir. Đó là vấn đề của quy ước. Nhiều người cố gắng biện minh cho _logically_ ràng buộc ngôn ngữ Java ban đầu của Sun, khi nó chỉ là một quan điểm cá nhân. Nếu trình biên dịch có thêm các giao diện "thực hiện", tôi đoán những người tương tự cũng đã biện minh cho nó. :-) –

1

Hy vọng điều này sẽ giúp bạn một chút những gì tôi đã học được trong oops (core java) trong trường đại học của tôi.

Thực hiện biểu thị xác định triển khai cho các phương thức của giao diện. Tuy nhiên các giao diện không có triển khai nào nên điều đó là không thể. Tuy nhiên, một giao diện có thể mở rộng một giao diện khác, có nghĩa là nó có thể thêm nhiều phương thức hơn và kế thừa kiểu của nó.

Dưới đây là ví dụ bên dưới, đây là sự hiểu biết của tôi và những gì tôi đã học được trong oops.

interface ParentInterface{ 
     void myMethod(); 
} 

interface SubInterface extends ParentInterface{ 
     void anotherMethod(); 
} 

và giữ một điều trong tâm trí một giao diện duy nhất có thể mở rộng giao diện khác và nếu bạn muốn xác định chức năng của nó trên một số lớp sau đó chỉ có một giao diện trong ví dụ thực hiện dưới đây

public interface Dog 
{ 
    public boolean Barks(); 

    public boolean isGoldenRetriever(); 
} 

Bây giờ, nếu một lớp là để thực hiện giao diện này, đây là những gì nó sẽ giống như sau:

public class SomeClass implements Dog 
{ 
    public boolean Barks{ 
    // method definition here 

    } 

    public boolean isGoldenRetriever{ 
    // method definition here 
    } 
} 

và nếu một lớp trừu tượng có một số chức năng trừu tượng xác định và kê khai, bạn muốn xác định những f unction hoặc bạn có thể nói thực hiện các chức năng sau đó bạn giả sử để mở rộng lớp đó bởi vì lớp trừu tượng chỉ có thể được mở rộng. đây là ví dụ bên dưới.

public abstract class MyAbstractClass { 

    public abstract void abstractMethod(); 
} 

Dưới đây là một ví dụ lớp con của MyAbstractClass:

public class MySubClass extends MyAbstractClass { 

    public void abstractMethod() { 
     System.out.println("My method implementation"); 
    } 
} 
Các vấn đề liên quan