Maison > Java > javaDidacticiel > Pourquoi Java interdit-il d'appeler la méthode Superclass d'une superclasse (super.super.method()) ?

Pourquoi Java interdit-il d'appeler la méthode Superclass d'une superclasse (super.super.method()) ?

DDD
Libérer: 2024-12-31 13:25:17
original
520 Les gens l'ont consulté

Why Does Java Prohibit Calling a Superclass's Superclass Method (super.super.method())?

Appeler la méthode Super de Super en Java : pourquoi est-ce interdit ?

Malgré la facilité avec laquelle on peut contourner certains scénarios en accédant au méthode parent utilisant directement super.super.method(), Java interdit une telle invocation. Cet article explore les raisons de cette restriction et examine si des mécanismes analogues existent dans d'autres langages.

Violation d'encapsulation

La principale raison pour laquelle Java interdit super.super.method() est de maintenir l'encapsulation. Ce principe empêche le contournement du comportement d'une classe parent en accédant directement à sa superclasse. Bien que contourner le comportement de sa propre classe puisse parfois être nécessaire, par exemple à partir de la même méthode, il ne devrait pas être possible pour les sous-classes de contourner le comportement de leurs parents.

Exemple : Maintenir les invariants de classe

Considérez une hiérarchie de classes : Items, RedItems et BigRedItems. Items représente une collection d'éléments, RedItems une collection d'éléments rouges et BigRedItems une collection de gros éléments rouges. Pour maintenir l'intégrité de chaque classe :

public class Items {
    public void add(Item item) { ... }
}

public class RedItems extends Items {
    @Override
    public void add(Item item) {
        if (!item.isRed()) {
            throw new NotRedItemException();
        }
        super.add(item);
    }
}

public class BigRedItems extends RedItems {
    @Override
    public void add(Item item) {
        if (!item.isBig()) {
            throw new NotBigItemException();
        }
        super.add(item);
    }
}
Copier après la connexion

Cela garantit que RedItems ne contient que des éléments rouges et que BigRedItems ne contient que de gros éléments rouges.

Rupture du contrat d'encapsulation

Si super.super.add() était autorisé :

public class NaughtyItems extends RedItems {
    @Override
    public void add(Item item) {
        // Add any item to NaughtyItems, ignoring the rule in RedItems
        super.super.add(item);
    }
}
Copier après la connexion

NaughtyItems pourrait contourner l'invariant dans RedItems, ajoutant des éléments sans discernement, rendant l'encapsulation de RedItems dénuée de sens.

Conclusion

Le L'interdiction de super.super.method() en Java est une protection importante qui empêche la violation de l'encapsulation, en maintenant l'intégrité et cohérence des hiérarchies de classes. Même si cela peut empêcher certains scénarios pratiques, cela garantit la robustesse et la fiabilité des bases de code Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal