7
votes

Classe de sous-classement de la classe extérieure par rapport à une autre classe intérieure

Je suis ignoré pourquoi cela est autorisé xxx

mais ce n'est pas autorisé xxx

le compilateur informé qu'il ne pouvait pas référence à FOOEY .Cefois avant que le constructeur de Supertype a été appelé.

et cela est autorisé xxx

Que se passe-t-il ici? Et où puis-je aller pour trouver plus d'informations sur la fonctionnement de l'héritage de la classe interne?

Modifier Je suis venu sur des idées assez mauvaises; La classe interne étend la classe extérieure et la classe interne étend une autre classe interne statique. Je n'étais pas sûr de quoi allait exactement et comment je devrais refracter cela. Je me suis retrouvé juste tirer sur les classes intérieures et les encapsuler dans la classe extérieure.


4 commentaires

Consultez cette question, à peu près sûr que cela duplique: Stackoverflow.com/questions/70324/...


Pas une dupe (du moins pas de celui-ci).


Quelle est l'utilisation d'une instance externe d'une classe que vous extensionnez?


@Jorn, je suis venu sur les deux problèmes lorsque vous souhaitez refacturer l'ancien code. Oui, quelque chose que terrible était dans un environnement de production.


4 Réponses :


1
votes

Je suppose que les JLS et les réponses à cette question sont un point de départ

classe intérieure Java et classe imbriquée statique

Classes intérieures et instances de conception


0 commentaires

6
votes

Tout d'abord: ne faites pas ce genre de chose. C'est mal. Vraiment, Java 1.1 aurait dû être spécifié beaucoup plus restrictivement, imo.

Il existe une confusion sur laquelle ceci à utiliser à partir du constructeur foo.fooey . L'extérieur ceci ( foo.C'est ) fonctionnerait. Mais le tel est un foo mais il ne peut pas être transmis au SuperConstructeur en raison de règles concernant l'utilisation de Ceci avant le retour du SuperConstructeur (et En plus d'avoir une instance extérieure, le même instance que l'instance interne est classée). L'extérieur ceci sur la superclasse " ((bar) ceci) .Ce 0 $ 0 " (IIRC), est également inaccessible en raison de restrictions à l'utilisation de Ceci

La solution doit être explicite. Explicite est généralement une bonne chose dans mon livre (à moins que cela ne devienne chaude). xxx

meilleur encore, ne pas avoir une classe intérieure étendre sa propre classe extérieure ou prolonger tout Classe intérieure.


2 commentaires

+1 pour votre première remarque. Si vous devez explicitement créer un constructeur, car le par défaut ne compile pas, je dirais que vous le faites mal (conception sage).


Tom, merci pour la réponse. Je suis venu sur les deux idées plutôt mauvaises; La classe interne étend la classe extérieure et la classe interne étend une autre classe interne statique. Je n'étais pas sûr de ce qui se passait.



1
votes

La réponse Tom Hawtin est correcte.

a également consulté Java Puzzler . Le chapitre d'échantillon contient ce cas et quelques autres cas "intéressants" que vous voudrez peut-être jeter un coup d'œil à.


0 commentaires

1
votes

(ne peut pas encore commenter - j'ai besoin de 50 représentant)

Je suis aussi ignoré que cela est autorisé. Une classe interne (non statique) d'une classe extérieure est en fait un membre de cette classe externe. Lire: un objet intérieur est un membre de son objet extérieur. (Incidemment, chaque objet extérieur doit posséder un objet intérieur, mais c'est en plus le point.)

L'analogie que j'aime utiliser est ceci: Soit voiture être la classe extérieure et laisser roue être la classe interne. Chaque instance de voiture doit, et fait, avoir au moins une instance de la roue en tant que membre.

Maintenant, il ne fait pas de sens conceptuel pour une classe interne pour prolonger une classe extérieure. Je ne peux pas penser à des situations du monde réel qui appellent qu'un objet étant à la fois membre et un type d'un autre objet. Définir les théoriciens rappellera le axiome de la régularité et ses conséquences.

Pensez-y de cette façon: Laissez honda étendre voiture et laisse honda être une classe intérieure nichée à l'intérieur voiture . Ce que vous dites ici, c'est que chaque honda objet est un objet voiture objet (DUH) et chaque voiture objet a un objet honda . Une seule de ces déclarations a du sens, mais les deux sont autorisées à être vraies en Java.

ou retour à l'analogie précédente, vous ne devez pas laisser roue étendre voiture car une roue sera A voiture , et par définition doit avoir une autre roue , qui, par la manière dont est un Voiture et donc doit avoir une roue et pour toujours et jamais amen. La construction d'un objet voiture entraînerait une boucle infinie d'objets imbriqués.

Je suis fâché que ceci est légal et ne produit pas d'erreur de compilation.


5 commentaires

Imaginez à quel point vous seriez contrarié si vous l'avez vu dans le code de production!


Si Honda étend la voiture, il fait pas que chaque objet de voiture a un objet Honda.


@Ray: Oui, mais si Honda est imbriquée à l'intérieur de la voiture (A.k.a. un "membre" de la voiture), il fait chaque objet de voiture a un objet Honda.


Pas vrai. Si Honda est une classe interne de voiture, un objet de voiture n'a pas nécessairement un objet Honda. D'autre part, un objet Honda doit avoir une référence à l'objet de voiture parent. Vous devez être capable de différencier entre une classe membre et une variable membre.


Compris. Serais-je correct en supposant qu'un objet de voiture ait un objet honda uniquement si la classe voiture contient la ligne: Honda Accord privé; ?