2016-10-01 6 views
0

je une classe appelée Module qui a une méthode onEnable(); Maintenant, je suis une classe appelée Config et que vous voulez faire la méthode onEnable();private parce qu'il ya une action prédéfinie et une classe extension Config devrait Ne pas être autorisé à changer le comportement.Assigner plus faible accès à dominante méthode de superclasse

Y at-il un moyen de le faire?

Exemple

class Module{ 

    public void onEnable(){ 

    } 
} 

Une classe extension du module qui est autorisé à utiliser onEnable:

class HelloWorldModule{ 

    @Override 
    public void onEnable(){ 

      System.out.println("Hello, World!"); 

    } 


} 

Maintenant, la classe de configuration, où je veux que onEnable est privé de sorte que les classes qui étendent la configuration ne peut pas! Remplacer onEnable:

class Config{ 

    @Override 
    private void onEnable(){ 
    } 


} 

maintenant, une classe nommée ProgrammConfig qui étend Config ne peut pas passer outre onEnable.

Toutefois, cela ne fonctionne pas car vous ne pouvez pas remplacer une méthode public par une méthode private.

+0

Ainsi la classe 'config' étend la classe' module'? –

+0

Oui. Et puis il y a d'autres classes qui ne font que prolonger Module. Mais les classes extension config qui étend le module ne devrait pas être en mesure de remplacer onEnable –

+0

Votre exigence n'est pas très claire, pouvez-vous s'il vous plaît redéfinir le problème et l'exigence. Si possible, présentez du code. –

Répondre

2

En déclarant une méthode comme public, vous dites qu'il devrait être possible d'appeler ledit procédé sur chaque instance de cette classe, y compris sous-classes. Déclarer une méthode comme private dans une sous-classe n'a pas de sens, et n'est donc pas autorisé.

Maintenant, si vous êtes préoccupé par les sous-classes Redéfinition de la méthode, vous pouvez déclarer la méthode comme final pour empêcher cela:

class Config extends Module{ 

    @Override 
    public final void onEnable(){} 
     //Whatever 
    } 
+0

ah, merci. exactement ce que j'ai cherché! –

0

Vous ne pouvez pas résoudre cela en utilisant l'héritage. Si Config est une sous-classe de Module, alors doit fournir toutes les fonctions de Module avec (au plus) les mêmes restrictions d'accès. Pensez à une sous-classe comme une version spécialisée de la superclasse: elle peut faire tout ce que la superclasse peut, probablement plus, mais jamais moins.

Vous pouvez toujours implémenter une classe Config comme vous le souhaitez. Il suffit de sauter subclassing, et au lieu d'utiliser un champ privé de type Module comme ceci:

class Config { 
    private Module module; 

    public Config() { 
     module = new Module(); 
    } 

    public int SomeFunctionFromModuleYouWantToExpose() { 
     return module.SomeFunctionFromModuleYouWantToExpose(); 
    } 

    // ... 
}