Un appel à super super méthode de classe
Disons que j'ai trois classes A, B et C.
- B extends A
- C extends B
Ont tous un public void foo()
méthode définie.
Maintenant C foo()
méthode je veux appeler Un de foo()
méthode (PAS son parent B de la méthode, mais le super super classe Une méthode).
J'ai essayé super.super.foo();
, mais c'est une syntaxe non valide.
Comment puis-je y parvenir?
- Juste parce que quelqu'un doit se demander, pourquoi est-ce que C prolonger B si vous semblez vouloir étendre Un directement? (J'imagine qu'il y a d'autres pièces que vous êtes en s'appuyant sur B de fonctionnalités, ou quelque chose)
- Un des foo() peut être appelée à partir de C à l'aide de super.foo() seulement si B n'est pas de remplacer Une des foo().
- Efficace Java 2nd Edition, Point 16: Favoriser la composition au cours de l'héritage. Aussi, découvrez le décorateur modèle; il peut répondre à votre besoin de mieux.
- double possible de Pourquoi est super.super.méthode(); pas permis en Java?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez même pas utiliser la réflexion. Quelque chose comme
conduirait à une
InvocationTargetException
, parce que même si vous appelez le foo-Méthode sur la superSuperClass, on utilise toujoursC.foo()
lorsque vous spécifiez "ce" en invoquer. C'est une conséquence du fait que toutes les méthodes de Java sont des méthodes virtuelles.Il semble que vous besoin de l'aide de la classe B (par exemple en définissant un
superFoo(){ super.foo(); }
méthode).Cela dit, ça ressemble à un problème de conception si vous essayez quelque chose comme ça, alors il serait utile de nous donner un peu de contexte: Pourquoi vous besoin de faire cela?
foo()
, vous avez besoin de réflexion pour accéder à ces (et bien sûr, vous êtes hors de la chance si un gestionnaire de sécurité est en place). En outre, si l'originalfoo()
codesuper
appelle lui-même, il ne serait pas plus efficace.Vous ne pouvez pas, car il serait briser l'encapsulation.
Vous êtes en mesure d'appeler votre super-classe de la méthode, car il est supposé que vous savez ce qui rompt l'encapsulation dans votre propre classe, et d'éviter que... mais vous ne savez pas quelles sont les règles à votre super-classe est l'application - de sorte que vous ne pouvez tout simplement pas éviter une mise en oeuvre il.
Type.this
ne compile pas. :-/System.identityHashCode
?Vous ne pouvez pas le faire d'une manière simple.
C'est ce que je pense que vous pouvez faire:
Ont un bool dans votre classe B. Maintenant, vous devez appeler B foo de C comme
[super foo]
mais avant de le faire ensemble le booléen à true. Maintenant en B foo vérifier si le booléen est vrai, alors ne pas exécuter toutes les étapes et il suffit d'appeler Un des foo.Espère que cette aide.
Citer une réponse précédente ", Vous ne pouvez pas, car il serait briser l'encapsulation." à qui je tiens à ajouter que:
Il y a cependant un cas de coin,où vous pouvez, à savoir si la méthode est
static
(public
ouprotected
). Vous ne pouvez pas remplacer la méthode statique.Avoir un
public static
méthode est aisé de prouver que vous pouvez le faire en effet cette.Pour
protected
cependant, vous avez besoin de l'intérieur de l'une de vos méthodes pour effectuer un cast de tout super-classe dans le chemin d'héritage et celui de la superclasse de la méthode appelée.C'est le cas de coin j'explore dans ma réponse:
La réponse reste toujours Pas, mais je voulais juste montrer un cas où vous pouvez, bien qu'il n'y aurait probablement pas de sens et n'est qu'un exercice.
Oui vous pouvez le faire. C'est un hack. Essayez de ne pas la conception de votre programme de ce genre.
Il n'est pas possible, nous nous sommes limités à l'appel de la super-classe des implémentations seul.
Je l'odeur quelque chose de louche ici.
Êtes-vous sûr que vous ne sont pas seulement de repousser les limites trop loin "juste parce que vous devriez être en mesure de le faire"? Êtes-vous sûr que c'est le meilleur modèle de conception que vous pouvez obtenir? Avez-vous essayé la refactorisation?
J'ai eu un problème où un super-classe pourrait appeler un sommet de la méthode de classe qui a été neutralisé.
C'était ma solution de contournement...
//CE SERAIT un ÉCHEC d'APPEL de la SUPERCLASSE des MÉTHODES, COMME l'a1() invoque sommet de la MÉTHODE de classe
//CE QUI GARANTIT LE DROIT DE LA SUPERCLASSE MÉTHODES SONT APPELÉES
//les méthodes publiques seulement appeler des méthodes privées ainsi, toutes les méthodes publiques peuvent être remplacées sans y apporter de la super-classe de la fonctionnalité.
J'espère que cette aide.
🙂
Avant l'utilisation de la réflexion de l'API de réfléchir sur le coût de celui-ci.
Il est tout simplement facile à faire. Par exemple:
C sous-classe de B et B sous-classe de A. Deux des trois méthodes methodName() par exemple.
Exécuter classe C Sortie sera:
De Classe A
Classe C
Au lieu de la sortie:
De Classe A
Classe B
Classe C
Dans mon cas simple, j'ai dû hériter B et C de la classe abstraite, qui incapsulates l'égalité des méthodes de B et C. Afin que
Tout ça ne résout pas le problème, il peut être utilisé dans les cas simples, quand C est semblable à B. Par exemple, lorsque C est initialisé, mais vous ne voulez pas utiliser les initialiseurs de B. Ensuite, il appelle simplement Abstr méthodes.
C'est une partie de a, B et C:
C'est B, qui a sa propre méthode
onCreate()
, qui existe dansAppCompatActivity
:C montre sa propre mise en page:
Il y a une solution qui a résolu mon problème similaire:
À l'aide de la classe A, B, et C scénario, il y a une méthode qui ne sera pas briser l'encapsulation et ne demande de déclarer la classe C à l'intérieur de la classe B. La solution de contournement consiste à déplacer de la classe B les méthodes de la dans un mais la méthode protégée.
Puis, si ceux de la classe B les méthodes ne sont pas tenus simplement remplacer cette méthode, mais n'utilisez pas "super" à l'intérieur de cette méthode. Primordial de ne rien faire et neutralise efficacement que la classe B de la méthode.
Le résultat sera: