polymorphisme - public static java




Modificateur d'accès au constructeur de classe abstraite (3)

Une classe abstraite peut seulement être utilisée comme une classe de base qui est étendue par une autre classe, n'est-ce pas? Le ou les constructeurs d'une classe abstraite peuvent avoir les modificateurs d'accès habituels (public, protected et private (pour usage interne)). Lequel de protected et public est le modificateur d'accès correct à utiliser, puisque le type abstrait semble indiquer que techniquement un constructeur public agira très protégé? Devrais-je juste utiliser protégé sur tous mes constructeurs?


puisque le type abstrait semble indiquer que techniquement un constructeur public agira très bien protégé

Ce n'est pas correct. Une classe abstraite ne peut pas être directement créée en appelant son constructeur, cependant, toute implémentation concrète héritera des méthodes et de la visibilité de la classe abstraite

Donc la classe abstraite peut certainement avoir des constructeurs publics.

En fait, le constructeur de la classe abstraite ne peut être appelé que depuis le constructeur de l'implémentation, donc il n'y a pas de différence entre le constructeur et la classe publique. Par exemple:

public class Scratch
{
    public static abstract class A
    {
        public A( int i ) {}
    }

    public static class B extends A
    {
        private B() { super(0); };
    }
}

puisque le type abstrait semble indiquer que techniquement un constructeur public agira très bien protégé

Umm ... pour les classes abstraites, cette portée du constructeur [public ou protected] n'est pas très différente puisque l'instanciation n'est pas autorisée [même si elle est publique]. Comme il est destiné à être invoqué par la sous-classe, il peut invoquer un constructeur public ou protégé de manière transparente.

C'est complètement sur le choix de quoi utiliser. Je préfère généralement le public comme c'est le cas dans la plupart des cas.


Si ce comportement est vrai, et je ne suis pas sûr que ce soit le cas, vous devez toujours utiliser la portée la plus restreinte disponible pour que votre application fonctionne. Donc dans ce cas, je recommanderais d'utiliser protégé.





java