web-dev-qa-db-fra.com

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

Ce que je veux dire est:

interface B {...}

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

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

Je l'ai googlé et j'ai trouvé this :

implements indique 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, interface est une classe abstraite à 100% et une classe abstraite peut implémenter des interfaces (classe abstraite à 100%) sans implémenter ses méthodes. Quel est le problème quand il est défini comme "interface"?

En détails,

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
101
user467871

implements signifie implémentation, lorsque interface est censé déclarer simplement pour fournir interface pas pour implémentation.

A 100% abstract class est fonctionnellement équivalent à interface, mais il peut également 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 plus, la variable membre d'une classe abstraite à 100% peut avoir n'importe quel qualificatif d'accès, alors que dans une interface, elles sont implicitement public static final.

103
Jigar Joshi

implements signifie qu'un comportement sera défini pour les méthodes abstract (à l'exception des 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 que l’autre, il n’ya même pas de mise en oeuvre réelle. C'est pourquoi il est plus logique pour une interface de extends une autre interface de la mettre en œuvre.


Sur une note de côté, rappelez-vous que même si une classe abstract peut définir des méthodes abstract (comme le ferait une interface), il s'agit toujours d'une classe et a toujours être hérité (étendu) et non implémenté.

24
Colin Hebert

Conceptuellement, il existe deux classes et interfaces "domaines". A l'intérieur de ces domaines, vous étendez toujours, seule une classe implémente une interface, ce qui revient à "franchir la frontière". Donc, fondamentalement, "étend" pour les interfaces reflète le comportement des classes. Au moins, je pense que c'est la logique derrière. Il semble que tout le monde ne soit pas d'accord avec ce type de logique (je le trouve moi-même un peu artificiel), et en fait, il n'y a aucune raison technique d'avoir deux mots-clés différents.

4
Landei

Cependant, interface est une classe abstraite à 100% et une classe abstraite peut implémenter une interface (classe abstraite à 100%) sans implémenter ses méthodes. Quel est le problème quand il est défini comme "interface"?

C'est simplement une question de convention. Les rédacteurs du langage Java ont décidé que "l’extension" était le meilleur moyen de décrire cette relation, c’est ce que nous utilisons tous.

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

Comme d’autres l’affirment, il existe de bonnes raisons de choisir "s’étend" sur "les outils".

2
Josiah Yoder

J'espère que cela vous aidera un peu à apprendre ce que j'ai appris en oups (noyau 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 plus de méthodes et hériter de son type.

Voici un exemple ci-dessous, voici ce que j'ai compris et ce que j'ai appris dans les ouf.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

et gardez une chose en tête, une interface ne peut étendre qu'une autre interface et si vous voulez définir sa fonction sur une classe, alors seule une interface est implémentée, par exemple ci-dessous

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Maintenant, si une classe implémentait 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 une fonction abstraite definir et déclarer et que vous voulez définir ces fonctions ou vous pouvez dire implémenter ces fonctions, vous supposez étendre cette classe car la classe abstraite ne peut ê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");
    }
}
1
XxANxX