web-dev-qa-db-fra.com

Java pourquoi interface étend l'interface

Je me demande dans quelles circonstances étendons-nous une interface à partir d'une interface? Parce que, par exemple 

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}

N'est-ce pas équivalent à 

interface A{
    public void method1();
}
interface B{
    public void method2();     
}
class C implements A, B{
    @Override public void method1(){}
    @Override public void method2(){}
}

Y a-t-il des raisons importantes derrière?

30
peter

Les raisons importantes dépendent entièrement de ce que l'interface est censée faire.

Si vous avez une interface Véhicule et une interface Drivable, tous les véhicules peuvent être conduits. Sans héritage d'interface, chaque type de voiture nécessitera

class ChevyVolt implements Vehicle, Drivable
class FordEscort implements Vehicle, Drivable
class ToyotaPrius implements Vehicle, Drivable

etc.

Comme je le disais, tous les véhicules peuvent être conduits, il est donc plus facile d'avoir simplement:

class ChevyVolt implements Vehicle
class FordEscort implements Vehicle
class ToyotaPrius implements Vehicle

Avec véhicule comme suit:

interface Vehicle extends Drivable

Et pas besoin d'y penser.

46
Spencer Ruport

Oui il y en a: c'est comme l'héritage n'importe où ailleurs. Si B est une spécialisation de A, alors il devrait être écrit de cette façon. La seconde indique que la classe arrive à implémenter 2 interfaces sans relation entre elles.

Du point de vue du résultat final, vous pouvez simplement utiliser plusieurs interfaces au lieu de gérer une hiérarchie (tout comme vous pouvez éviter d'utiliser le comportement hérité dans une hiérarchie de classe). Cela laisserait cependant les informations plus dispersées et, de manière significative (si ce n'est plus), obscurcirait l’intention du modèle logiciel.

12
Matt Whipple

Oui, il y a une grande différence.

Dans votre premier exemple, votre nouvelle interface B est définie de manière à s’étendre de A, aussi, la classe toute qui implémente B automatiquement implémente A. En gros, vous dites au compilateur " voici ce que cela signifie d'être un A, voici ce que cela signifie d'être un B, et oh, au fait, tous les B sont aussi des A ! " Cela vous permet de dire des choses comme ...

class C implements B {
    ... you implement all of the methods you need...
    ...blah...
    ...blah...
}
A myNewA = new C();

et ça marche bien.

Mais, dans votre seconde exemple, vous ne déclarez pas que B doit étendre A, le code ci-dessus ne fonctionnerait donc pas. Lorsque vous essayez d'affecter une instance de (le second type de) C dans une référence pour A, elle se plaint, car vous {avez} _ avez dit au compliant que "tous les B sont vraiment des A". (c'est-à-dire qu'il n'y a pas de relation entre B et C)

5
Bob Gilmore

Si vous ne voulez pas que B soit implémenté sans implémenter A, vous pouvez faire en sorte que B.

Exemple:

interface LivingThing{
public void eat();
}

interface Dog extends LivingThing{
public void Bark();
}

Il est possible d'être un livingThing sans être un chien, mais il n'est pas possible d'être un chien sans être un livingThing. Donc, s'il peut aboyer, il peut aussi manger, mais le contraire n'est pas toujours vrai.

2
WVrock

Ce que vous dites est juste, mais il ne s'agit pas seulement de faire notre travail, mais si l'exigence est la suivante:

1) Imaginez qu’il existe 10 interfaces non conçues en même temps. Par exemple l'interface AutoCloseable en Java 7. Une nouvelle fonctionnalité de fermeture automatique a été ajoutée. Elle n'était pas disponible avant Java 6.

2) Si vous avez conçu une interface C qui est une interface de marqueur et que vous voulez que toutes les classes dérivées d’une classe B donnée soient marquées, la meilleure solution serait d’utiliser B.

Il y a beaucoup plus de raisons. Si vous regardez l’ensemble des classes et de la hiérarchie, vous obtiendrez vous-même la réponse.

Heureux d'aider Dharam

1
dharam

La principale différence ici est que dans votre premier exemple, B est A et ensuite. Cela signifie que l'interface B appelle method1 () et method2 (), où, comme dans le second, A et B sont séparés (l'interface B NE CONCLUT PAS method1 ()) et que la classe C implémente A et B. Dans les deux instances, la classe C remplacera méthode1 () et method2 (). J'espère que ça aide!

0
Nick