Почему интерфейс не может реализовать другой интерфейс? - PullRequest
101 голосов
/ 13 октября 2010

Что я имею в виду:

interface B {...}

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

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

Я гуглил это и нашел это :

implements обозначает определение реализации для методов интерфейса. Однако интерфейсы не имеют реализации, поэтому это невозможно.

Однако интерфейс - это 100% абстрактный класс, и абстрактный класс может реализовывать интерфейсы (100% абстрактный класс) без реализации своих методов. В чем проблема, когда он определяется как «интерфейс»?

Подробнее

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

Ответы [ 6 ]

103 голосов
/ 13 октября 2010

implements означает реализацию, когда interface предназначен для объявления просто, чтобы предоставить interface не для реализации.

100% abstract class функционально эквивалентно interface, но может также иметь реализацию, если хотите (в этом случае она не останется 100% abstract), поэтому с точки зрения JVM они отличаются вещи.

Также переменная-член в 100% абстрактном классе может иметь любой квалификатор доступа, где в интерфейсе они неявно public static final.

24 голосов
/ 13 октября 2010

implements означает, что поведение будет определено для abstract методов (за исключением, очевидно, абстрактных классов), вы определяете реализацию.

extends означает, что поведение наследуется.

С интерфейсами можно сказать, что один интерфейс должен иметь то же поведение, что и другой, даже реальной реализации не существует.Вот почему имеет смысл использовать интерфейс для extends другого интерфейса, а не для его реализации.


Заметьте, что даже если класс abstract может определять методы abstract (как и интерфейс), он все еще является классом и все еще должен быть унаследован (расширен) и не реализован.

4 голосов
/ 13 октября 2010

Концептуально существуют два «домена» классов и интерфейсов. Внутри этих доменов вы всегда расширяете, только класс реализует интерфейс, который как бы «пересекает границу». Таким образом, в основном «расширяется» для интерфейсов, отражает поведение классов. По крайней мере, я думаю, что это логика позади. Кажется, что не все согласны с такой логикой (я нахожу ее немного надуманной), и на самом деле нет технической причины вообще иметь два разных ключевых слова.

2 голосов
/ 18 декабря 2013

Однако интерфейс - это 100% абстрактный класс, и абстрактный класс может реализовывать интерфейс (100% абстрактный класс) без реализации его методов.В чем проблема, когда он определяется как «интерфейс»?

Это просто вопрос соглашения.Авторы языка Java решили, что "extends" - лучший способ описать эти отношения, поэтому мы все так и используем.

В общем, хотя интерфейс является "100% абстрактным классом", мыне думай о них таким образом.Мы обычно думаем об интерфейсах как об обещании реализовать определенные ключевые методы, а не класс, из которого можно получить.И поэтому мы склонны использовать другой язык для интерфейсов, чем для классов.

Как утверждают другие, есть веские причины для выбора «расширяет», а не «реализует».

1 голос
/ 16 августа 2014

Надеюсь, это поможет вам немного узнать, что я узнал в oops (ядро Java) во время моего колледжа.

Реализация обозначает определение реализации для методов интерфейса.Однако интерфейсы не имеют реализации, поэтому это невозможно.Интерфейс может, однако, расширить другой интерфейс, что означает, что он может добавлять больше методов и наследовать его тип.

Вот пример ниже, это мое понимание и то, что я узнал в упс.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

и помните, что один интерфейс может расширять только другой интерфейс, и если вы хотите определить его функцию в каком-то классе, то будет реализован только интерфейс, например, ниже

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Теперь, если классдолжны были реализовать этот интерфейс, вот как это выглядело бы:

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

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

и если абстрактный класс имеет некоторую абстрактную функцию, определите и объявите, и вы хотите определить эту функцию, или вы можете сказать, реализовать эту функцию,вы предполагаете расширить этот класс, потому что абстрактный класс может быть расширен только.Вот пример ниже.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Вот пример подкласса MyAbstractClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}
0 голосов
/ 19 сентября 2013

Интерфейс - это класс, который содержит абстрактный метод, который не может создать какой-либо объект. Поскольку Интерфейс не может создать объект, и он не является чистым классом, его не стоит реализовывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...