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?
Réponses
Trop de publicités?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.
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.
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();
}
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.
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.