77 votes

Comment les interfaces Java simulent-elles l'héritage multiple?

Je lis "Le tutoriel Java" (pour la deuxième fois). Je viens tout juste de passer à travers la section sur les interfaces, mais je ne comprends toujours pas comment les interfaces Java simulent un héritage multiple. Y a-t-il une explication plus claire que ce qui est dans le livre?

158voto

Peter Tillemans Points 20129

Supposons que vous avez 2 sortes de choses dans votre domaine : les Camions et les Cuisines

Les camions ont un driveTo() la méthode et de la cuisine d'un cuisinier() la méthode.

Supposons maintenant que Pauli décide de vendre des pizzas à partir de l'arrière d'un camion de livraison. Il veut une chose où il peut driveTo() et cook ().

En C++, il serait d'utiliser l'héritage multiple pour ce faire.

En Java qui a été considéré comme trop dangereux de sorte que vous pouvez hériter d'une classe principale, mais on peut "hériter" des comportements à partir des interfaces, qui sont à toutes fins et intentions de classes abstraites avec pas de champs ou de la méthode mise en œuvre.

Donc en Java, nous avons tendance à mettre en œuvre l'héritage multiple à l'aide de délégations :

Pauli sous-classes d'un camion et ajoute une cuisine pour le camion dans une variable de membre appelé à la cuisine. Il met en œuvre la Cuisine de l'interface par l'appel de la cuisine.cook().

class PizzaTruck extends Truck implements Kitchen {
   Kitchen kitchen;

   public void cook(Food foodItem) {
      kitchen.cook(foodItem);
   }
}

Il est un homme heureux, car il peut maintenant faire des choses comme ;

pizzaTruck.driveTo(beach);
pizzaTruck.cook(pizzaWithExtraAnsjovis);

Ok, cette histoire stupide, était de faire le point que c'est pas de la simulation de l'héritage multiple, c'est le véritable héritage multiple avec la condition que vous ne pouvez hériter du contrat, seulement hériter de vide classes de base abstraites qui sont appelées interfaces.

19voto

Michael Borgwardt Points 181658

Vous êtes probablement confus parce que vous avez vue l'héritage multiple localement, en termes d'une classe héritant de la mise en œuvre des détails de plusieurs parents. Ce n'est pas possible en Java (et conduit souvent à des abus dans les langues où c'est possible).

Les Interfaces permettent l'héritage multiple de types, par exemple, un class Waterfowl extends Bird implements Swimmer peut être utilisé par d'autres classes, comme si c'était une Bird et comme si c'était un Swimmer. C'est la signification profonde de l'héritage multiple: permettre à un objet d'agir comme il appartient à plusieurs sans rapport avec les différentes classes à la fois.

17voto

challenger Points 113

Voici un moyen de réaliser plusieurs héritages via des interfaces en Java.

Que faire?
classe A étend B, C // ceci n'est pas possible directement en Java mais peut être réalisé indirectement.

 class B{
   public void getValueB(){}
}

class C{
   public void getValueC(){}
}


interface cInterface{
   public getValueC();
}

class cChild extends C implemets cInterface{
    public getValueC(){

      // implementation goes here, call the super class's getValueC();

    }
}


// Below code is **like** class A extends B, C 
class A extends B implements cInterface{
   cInterface child =  new cChild();
   child.getValueC();
}
 

10voto

Bozho Points 273663

Les Interfaces ne pas simuler l'héritage multiple. Java créateurs considéré comme l'héritage multiple mal, donc il n'y a pas une telle chose en Java.

Si vous souhaitez combiner la fonctionnalité de deux classes en une seule utilisation de l'objet de la composition. I. e.

public class Main {
    private Component1 component1 = new Component1();    
    private Component2 component2 = new Component2();
}

Et si vous souhaitez exposer certaines méthodes, de les définir et de les laisser déléguer l'appel à la manette correspondante.

Ici interfaces peut être pratique - si Component1 implémente l'interface Interface1 et Component2 implémente Interface2, vous pouvez définir

class Main implements Interface1, Interface2

De sorte que vous pouvez utiliser des objets de façon interchangeable, lorsque le contexte le permet.

5voto

Mark Peters Points 42201

C'est assez simple. Vous pouvez implémenter plusieurs interfaces dans un type. Ainsi, par exemple, vous pourriez avoir une implémentation de List qui est aussi une instance de Deque (et Java le fait ... LinkedList ).

Vous ne pouvez tout simplement pas hériter des implémentations de plusieurs parents (c'est-à-dire étendre plusieurs classes). Les déclarations (signatures de méthodes) ne posent aucun problème.

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