106 votes

Pourquoi une interface ne peut-elle pas implémenter une autre interface ?

Ce que je veux dire, c'est que :

interface B {...}

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

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

J'ai cherché sur Google et j'ai trouvé este :

implements désigne la définition d'une implémentation pour les méthodes d'une interface. Cependant, les interfaces n'ont pas d'implémentation, donc ce n'est pas possible.

Cependant, l'interface est une classe 100% abstraite, et une classe abstraite peut implémenter des interfaces (classe 100% abstraite) sans implémenter ses méthodes. Quel est le problème lorsqu'elle est définie comme "interface" ?

En détail,

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

113voto

Jigar Joshi Points 116533

implements signifie la mise en œuvre, lorsque interface est censé déclarer juste pour fournir interface pas pour la mise en œuvre.

A 100% abstract class est fonctionnellement équivalent à un interface mais il peut aussi avoir une implémentation si vous le souhaitez (dans ce cas il ne restera pas 100% abstract ), donc du point de vue de la JVM, ce sont des choses différentes.

De même, les variables membres d'une classe 100 % abstraite peuvent avoir n'importe quel qualificatif d'accès, alors que dans une interface, elles sont implicites. public static final .

24voto

Colin Hebert Points 40084

implements signifie qu'un comportement sera défini pour abstract (sauf pour les classes abstraites évidemment), vous définissez l'implémentation.

extends signifie qu'un comportement est hérité.

Avec les interfaces, il est possible de dire qu'une interface doit avoir le même comportement qu'une autre, il n'y a même pas d'implémentation réelle. C'est pourquoi il est plus logique pour une interface de extends une autre interface au lieu de l'implémenter.


Par ailleurs, n'oubliez pas que même si une abstract peut définir abstract méthodes (comme le fait une interface), il s'agit toujours d'une classe et doit toujours être hérité (étendu) et non implémenté.

4voto

Landei Points 30509

Conceptuellement, il existe deux "domaines" : les classes et les interfaces. A l'intérieur de ces domaines, vous êtes toujours en train d'étendre, seulement une classe implémente une interface, ce qui est en quelque sorte "traverser la frontière". Donc, fondamentalement, "extends" pour les interfaces reflète le comportement des classes. Du moins, je pense que c'est la logique sous-jacente. Il semble que tout le monde ne soit pas d'accord avec ce type de logique (je la trouve moi-même un peu artificielle), et en fait il n'y a aucune raison technique d'avoir deux mots-clés différents.

2voto

Josiah Yoder Points 47

Cependant, une interface est une classe abstraite à 100% et une classe abstraite peut implémenter l'interface (classe 100% abstraite) sans implémenter ses méthodes. méthodes. Quel est le problème lorsqu'elle est définie comme "interface" ?

Il s'agit simplement d'une question de convention. Les auteurs du langage Java ont décidé que "extends" était la meilleure façon de décrire cette relation, et c'est donc ce que nous utilisons tous.

En général, même si une interface est "une classe 100% abstraite", nous ne les considérons pas de cette façon. Nous considérons généralement les interfaces comme une promesse d'implémentation de certaines méthodes clés plutôt que comme une classe dont on peut dériver. Nous avons donc tendance à utiliser un langage différent pour les interfaces que pour les classes.

Comme d'autres l'ont dit, il y a de bonnes raisons de choisir "extends" plutôt que "implements".

1voto

XxANxX Points 24

J'espère que cela vous aidera un peu à comprendre ce que j'ai appris dans oops (core java) pendant mes études.

Implements désigne la définition d'une implémentation pour les méthodes d'une interface. Cependant, les interfaces n'ont pas d'implémentation, donc ce n'est pas possible. Une interface peut toutefois étendre une autre interface, ce qui signifie qu'elle peut ajouter des méthodes supplémentaires et hériter de son type.

Voici un exemple ci-dessous, c'est ma compréhension et ce que j'ai appris dans oops.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

et gardez une chose à l'esprit : une interface ne peut qu'étendre une autre interface et si vous voulez définir sa fonction sur une classe, alors seule une interface peut être implémentée, par exemple ci-dessous.

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Maintenant, si une classe devait implémenter cette interface, voici à quoi elle ressemblerait :

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

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

et si une classe abstraite a quelques fonctions abstraites définies et déclarées et que vous voulez définir ces fonctions ou vous pouvez dire implémenter ces fonctions alors vous devez étendre cette classe parce que la classe abstraite peut seulement être étendue. voici l'exemple ci-dessous.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Voici un exemple de sous-classe de MyAbstractClass :

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X