Cyclique de l'héritage utilise
Donc, si j'écris le code suivant dans Java:
public class A extends A{
public static void main(String[] args){
}
}
Cela donne un message d'erreur compilateur cyclique héritage impliquant A.
La même chose arrive si j'écris deux classes A et B et A hérite de B et B hérite de A.
Cela fait sens pour moi, car il est assez difficile d'imaginer comment ce serait possible de toute façon.
J'ai alors demandé à ce sujet par l'un des professeurs de mon uni. Il a dit il y a des langues où c'est possible et il a déploré la façon dont ce n'est pas possible en Java et qu'il avait fait de certains projets où il avait utilisé cyclique de l'héritage et ainsi de suite, mais je ne pouvais pas vraiment comprendre tout ça. Il a également mentionné qu'il avait eu des problèmes là où il aurait aimé utilisation cyclique de l'héritage.
Pouvez-vous m'instruire sur les utilisations possibles de cet étrange des phénomènes cycliques de l'héritage? Quand est-il possible, et comment? Sont-il des problèmes où cela pourrait être utile?
- Il serait mieux si vous demandez à votre professeur pour enseigner vous. Un enseignant de travail ne peut pas être source de confusion, les élèves et de les laisser sans réponse concrète.
- Une chose à garder à l'esprit est que les gens dans le milieu universitaire peuvent parfois en manque de pensée pratique quand il s'agit de certaines de leurs idées animal de compagnie, en particulier à mesure qu'ils vieillissent. J'ai eu un instructeur qui a pensé que la meilleure façon de concevoir les listes chaînées était de rendre les clients hériter de la
ListNode
classe, parce que c'est la façon dont le Modula-3 environnement à l'apogée de sa carrière universitaire a été fondée en ont fait les choses. (Même si c'est évident conception de l'abomination de la plupart quelqu'un d'autre.) Si vous ne pouvez pas penser à une utilisation pour l'exotisme d'un langage de construire, et le professeur ne peut pas l'expliquer simplement, c'est peut-être pas très utile. - Maintenant que j'y pense, il aurait peut-être dit-il simulé ce type d'héritage ou quelque chose, ne pas utiliser en tant que tel, mais pas sûr. Tout cela s'est passé il y a quelques années...
- Aussi, je voudrais ajouter que j'ai demandé à ce dans un couloir ou quelque chose et il n'a pas eu trop de temps et tout et tout...
- Il y a quelques années je suis tombé sur une langue dans laquelle
True
etFalse
étaient catégories distinctes et ont été définis mutuellement de manière récursive. Malheureusement j'ai oublié le nom de la langue.
Vous devez vous connecter pour publier un commentaire.
J'ai dégoté cette référence intéressante: fondamentalement, il dit que cyclique de l'héritage est valide tant qu'il n'y a pas répété domaines, comme la recherche de pour n'importe quel champ doit parcourir une boucle du cycle de trouver un sens. Si un champ est répétée aucune des deux définitions est d'autant plus valable que l'autre, et apparemment il y aurait un problème.
Donc, supposons que vous souhaitez définir une personne comme un être humain et en tant qu'électeur, et de définir des attributs différents pour chacun. En pseudo-code:
Maintenant, vous pouvez aborder les différents aspects d'un individu, sans avoir à définir une hiérarchie, et vous pouvez instancier des personnes différentes d'une Personne (avec le nom), un Homme (qui parle une langue) ou d'un Électeur, dans un pays donné). Aucun aspect n'est plus important que l'autre.
Bien qu'intéressante, je ne pense pas que c'est pratique pour une utilisation en dehors des projets de recherche. Imaginez avoir constructeurs pour toutes les classes qui passer des paramètres à la super() constructeurs -- il serait facile de gâcher toute la construction.
Mise à jour: le pseudo-code ne compile pas, traduits de Java 8, et, apparemment, en vertu de n'importe quelle langue (à l'exception de Cecil, comme indiqué par le lien donné ci-dessus). Il semble que personne n'a trouvé pour être valable, toute usages et donc refusé cyclique de l'héritage. Cela ne signifie pas que le concept est en soi impossible, juste que les utilisations pratiques ne justifie pas l'effort de mise en œuvre de la cas particulier.
If a field is repeated then none of the two definitions is more valid than the other and apparently there would be a problem.
- Pourquoi? Si nous avons:class A extends B: String field1; class B extends A: String field1
alors si nous faisons une instancea = A.new('field1 in A')
puisa.field1
appellerafield1
deA
. ps. il y a peut-être un problème qui cause une boucle infinie: sifield1
est une procédure/fonction (un.champ1 b.champ1 => b.champ1 appel un.champ1 => ... la boucle infinie)Je suis en désaccord avec la accepté de répondre que les états que leur code ne sera pas jeter une erreur. Je suis en cours d'exécution Java 8 et compilé le code suivant:
et j'ai reçu un message d'erreur indiquant "erreur: cyclique héritage impliquant la Personne."
Donc, en Java, vous ne pouvez pas avoir cyclique de l'héritage.
Je ne pouvais voir que c'est possible que si les classes étaient sur le même niveau de la hiérarchie. Pensez à la hiérarchie de classe comme un arbre, qui il est. Java cherche la hiérarchie à au moins un niveau au-dessus ou plus. Dans certaines langues, vous serez en mesure d'hériter des caractéristiques d'une classe au même niveau que la classe que vous utilisez.
Je ne comprends pas le sens de l'cyclique de l'héritage. Je ne sais pas pourquoi votre professeur pense qu'il est utile dans anycase l'esprit que l'héritage de la création qui est appelé EST-UN relation stipule que si B est une sous-classe de A, puis B EST-UN UN dans le sens que partout, un à Un, c'est un B peut être utilisé sans problème (principe de substitution de Liskov).
Maintenant, théoriquement, si A est une sous-classe de B et B est une sous-classe de A, puis ensuite les deux classes doivent avoir exactement la même à l'extérieur de l'interface. Cela parce que si vous ajoutez une méthode à l'autre on va hériter de la même méthode automatiquement de sorte que vous devrez soit remplacer, soit pour obtenir de l'autre la mise en œuvre.
En outre, vous aurez de nombreuses circonstancié dans laquelle les effets secondaires entre en jeu (pensez à la méthode
A.foo()
appelsuper.foo()
etB.foo()
appelsuper.foo()
. Je ne vois pas la raison pratique, parce que cela devrait être permis.L'héritage est conçu comme un arbre dans lequel chaque sous-classe spécifie le comportement ou les classes qui sont dans l'arbre, ayant deux classes de même niveau ne veut pas dire quelque chose d'utile.
Cyclique de l'héritage est d'aucune utilité et que d'ailleurs nous allons voir pourquoi, logiquement, il n'est pas permis.
Je voudrais commencer avec
Object
classe, si une classe ne s'étend pas à toute la classe qu'il étendObject
classe (ce qui est vrai), et si une classe étend à toute autre catégorie indirectement étend leObject
classe.Exemple:
classe
A
s'étendObject
, parce queB
classe étendObject
classe.Alors, quand nous ne Cyclique de l'Héritage, il n'a jamais étendu la classe de l'Objet.
Exemple:
J'espère avoir été clair, et une sorte de classe qui ne peut pas s'étendre
Object
classe qui n'est pas possible en Java.