Question

Voici un exemple en utilisant l'héritage d'interface multiple en Java et il y a un problème.

Notez que je sais très bien pourquoi il y a un problème et ce n'est pas le point de ma question. La question est de savoir comment vous nommez cette particulière ambiguïté de l'héritage d'interface multiple, s'il y a un nom.

Par exemple, en C ++, l'ambiguïté qui se pose lorsque vous utilisez l'héritage multiple de mise en œuvre et ne peut pas déterminer quelle méthode surchargée à utiliser est appelé le « problème de diamant »:

http://en.wikipedia.org/wiki/Diamond_problem

Maintenant, une fois encore, je sais que ce n'est pas le même problème ici: ce n'est pas le point. Le point est qu'un nom a été inventé dans ce cas précédent.

Et je voudrais savoir si un nom existe pour la question que je vais décrire.

Voici un exemple d'une autre sorte d'héritage multiple, où une interface hérite de deux autres interfaces qui ont un type de retour de la méthode incompatible:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

(notez héritage multiple d'interface au travail à l'aide du mot-clé 'étend')

Vous ne pouvez pas faire cela, parce que:

  

types A et B sont incompatibles; tous les deux   définir c () mais avec le retour sans rapport avec   Type

a été un nom inventé pour décrire cette situation?

Était-ce utile?

La solution

Je ne suis pas sûr qu'il ya un nom spécifique pour elle, ou du moins il ne semble pas être très couramment utilisé. Il est « juste » un problème de l'application implicite des méthodes d'interface aux méthodes de classe; si vous pourriez avoir qui ne diffèrent que les surcharges dans les types de retour, il soit aurait pas de problème. Ainsi, il se résume à une signature / surcharge / problème de mappage de méthode implicite.

Dans la « Penser en Java » livre en ligne, il n'y a pas un nom pour qu'il soit. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001. htm

Juste un côté note, C # permet des implémentations d'interface explicites, ce qui résout ce problème.

Autres conseils

JLS §6.4. 4, les membres d'un type d'interface appelle ces membres en double superinterface ambigu , et nécessite une erreur de compilation. J'espérais quelque chose de coloré comme le Heisenbug , et al . Peut-être two's-a-foule

Je ne sais pas non d'un nom spécifique pour ce problème. Chaque fois qu'il se présentait, il a été décrit dans une phrase contenant les mots incompatibilité de type de retour à un moment donné. Vous pouvez aussi appeler le Carte / Set INCOMPATIBILITÉ que c'est l'un des exemples les plus importants et gênants dans les bibliothèques de classes Java. Il rend impossible d'avoir la même classe de mettre en œuvre la carte ainsi que Set ou Collection juste parce que la carte définit une remove (Object) Méthode avec un autre type de retour que Collection.

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

Je hésite à appeler cela un multiple problème d'héritage, parce que les interfaces ne font que décrire bien, l'interface - un ensemble de méthodes d'une classe doit définir la mise en œuvre - plutôt que toute mise en œuvre. L'extension d'une interface avec d'autres interfaces ne signifie pas vraiment les hérite subinterface du superinterface, mais plutôt que le sous-interface est, en substance, une concaténation des méthodes définies dans les deux.

Si une troisième interface est utilisée pour étendre la sous-interface et fournit une déclaration de méthode contradictoires, il est essentiellement le même que si vous aviez fourni les mêmes deux méthodes contradictoires dans la même interface.

Je ne me souviens pas si je l'ai jamais vu un nom pour cela. langage Java spécification il n'y a pas de nom pour ce soit.

La question que vous décrivez existe dans .NET, ainsi que Java, mais a une solution simple là: le framework .NET permet à une classe pour mettre en œuvre un élément d'interface à l'aide d'un membre de la classe avec un nom différent. Ainsi, bien que les méthodes de classe qui mettent en œuvre deux membres d'interface qui ne diffèrent que par le type de retour doivent avoir des noms différents, qui ne fait pas obstacle à leur capacité à mettre en œuvre des membres d'interface avec le même nom.

Si une interface hérite de deux interfaces avec des membres en conflit, une classe qui implémente l'interface composite peut mettre en œuvre les membres comme si elle avait hérité des interfaces en conflit directement. Les consommateurs de l'interface combinée ne seront généralement pas en mesure d'utiliser les membres de l'une interface de composant sans conversion de la référence à l'un des autres types d'interface, mais la distribution en question sera considéré comme un upcast plutôt qu'un baissés.

Le système mis en œuvre dans .NET fonctionne très bien là-bas. Malheureusement, il n'y a aucun moyen de faire quelque chose de similaire à Java. Je ne sais pas que Java si gloussement une interface hérite d'autres interfaces avec les membres en conflit, mais si oui ou non il gloussements à ce moment-là, il n'y aurait aucun moyen de produire une classe qui pourrait le mettre en œuvre.

Je ne pense pas que le nom a été défini parce que les interfaces en Java ne peuvent pas avoir la mise en œuvre de la méthode, le problème est donc évité car il n'y a toujours qu'une seule mise en œuvre à une méthode spécifique et donc aucune ambiguïté surgiront.

Ai-je manqué le point ou ce que vous parlez de la variable 'c'?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top