Question Comment accéder à la super-classe en Java? [Mini-exemple à l'intérieur] [dupliquer]


Cette question a déjà une réponse ici:

Dans l'exemple ci-dessous, comment puis-je accéder, à partir de C, la méthode method() de la classe A?

class A {
    public void method() { }
}

class B extends A{
    public void method() { }
}

class C extends B{
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        C.super.method();  // B.method()
        B.super.method();  // ERROR <- What I want to know
    }
}

L'erreur que je reçois est

Aucune instance englobante du type B n'est   accessible dans la portée

Réponse: Non, ce n'est pas possible. Java ne le permet pas. Question similaire.


10
2018-01-15 08:33


origine


Réponses:


Vous ne pouvez pas - et très délibérément. Cela violerait l'encapsulation. Vous sauteriez n'importe quoi B.method veut faire - peut-être valider des arguments (en supposant qu'il y en avait), appliquer des invariants, etc.

Comment pourriez-vous vous attendre B garder une vue cohérente de son monde si une classe dérivée peut simplement ignorer le comportement défini?

Si le comportement fourni par B n'est pas approprié pour C, il ne devrait pas l'étendre. N'essayez pas d'abuser de cet héritage.


17
2018-01-15 08:38



Le code suivant pourrait être un contournement (pas sympa, mais devrait fonctionner):

class A {
    public void method() { }
}

class B extends A {
    public void method() { }
    protected void superMethod() {
         super.method();
    }
}

class C extends B {
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        superMethod();     // A.method()
    }
}

10
2018-01-15 11:18



Eh bien, il n'y a pas de moyen direct de le faire, mais vous pouvez toujours essayer des solutions de rechange.

Je ne suis pas certain de l’objet de l’accès à la méthode de la classe A à partir de la classe C, mais vous pouvez toujours vous procurer cette méthode.

Vous pouvez créer une instance de classe A dans la classe C et si cela semble trop simple, essayez d'utiliser l'API de réflexion ... [texte du lien] [1]

Java extrême


2
2018-01-15 11:00



Tu ne devrais pas.

Si vous voulez accéder aux méthodes dans A, S'étend de A au lieu de B.

Quand B étend A, il suppose que le sous-jacent A-object ne sera pas manipulé autrement que comme il le fait lui-même. Par conséquent, en accédant directement aux méthodes de A, vous pourriez casser comment B les fonctions.

Imaginez, par exemple, que vous ayez une classe qui implémente une liste, MyList. Maintenant, imaginons que nous étendions cette liste avec une autre classe appelée MyCountingList, qui remplace le add() et remove() méthodes pour compter les éléments ajoutés / supprimés. Si vous contournez le add() méthode MyCountingList fournit, en utilisant celui MyList a plutôt, vous avez maintenant cassé la fonctionnalité de comptage de MyCountingList.

Donc bref, ne le faites pas.


1
2018-01-15 08:37