2009-09-19 2 views
4

En Java, est-il possible de remplacer les données de membre dans une sous-classe et d'avoir cette version surchargée comme étant les données utilisées dans l'implémentation d'une super classe?Remplacer les données de membre dans la sous-classe, utiliser dans la mise en œuvre de la superclasse?

En d'autres termes, voici ce que je suis en train de se rendre à arriver, et il ne se produit pas:

abstract public class BasicStuff { 
     protected String[] stuff = { "Pizza", "Shoes" }; 

     public void readStuff() { 
       for(String p : stuff) { 
         system.out.println(p); 
       } 
     } 
} 

..

public class HardStuff extends BasicStuff { 
     protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" }; 
} 

Cette invocation:

HardStuff sf = new HardStuff(); 
sf.readStuff(); 

. .. imprime Pizza et Shoes. Je veux qu'il imprime ce dernier à la place.

Je reconnais que c'est une pratique OO plutôt médiocre; J'en avais besoin pour un cas très spécifique car je fais quelque chose avec la configuration et la réflexion XML.

Y a-t-il un modificateur qui peut rendre cela possible? Et oui, je reconnais qu'il existe des wrappers que l'on peut utiliser pour contourner ce problème dans ma sous-classe, c'est-à-dire en indiquant que le contenu de stuff[] est maintenant stocké dans un tableau avec un nom différent, par exemple. J'essaie simplement de garder cela simple, et je suis curieux en principe.

Merci beaucoup d'avance!

Répondre

13

Je crois que vous devez interposer une méthode accesseur, à savoir l'utilisation:

for(String p : getStuff()) { 

dans les superclasse, et d'ajouter:

protected String[] getStuff() { return stuff; } 

partout où vous avez une redéfinition protected String[] stuff.

Redéfinition applique vraiment aux méthodes, pas les données (au moins, il en est ainsi dans le modèle Java, d'autres langues font les choses différemment), et ainsi obtenir l'effet de substitution, vous devez interposer une méthode (généralement une saleté simple accesseur, comme ici). Cela ne complique pas vraiment les choses du tout, c'est juste une manière très simple d'ordonner au compilateur Java d'utiliser, intrinsèquement, le "niveau d'indirection supplémentaire" que votre comportement désiré requiert.

4

De cette façon, vous masquez la variable parent avec les données définies.

Essayez de donner de la valeur à des choses dans le bloc d'initialisation (ou dans le constructeur):

abstract public class BasicStuff { 
    protected String[] stuff; 

    { 
    stuff = new String[] { "Pizza", "Shoes" }; 
    } 

    public void readStuff() { 
    for(String p : stuff) { 
     System.out.println(p); 
    } 
    } 
} 

..

public class HardStuff extends BasicStuff { 
    { 
    stuff = new String[] { "Harmonica", "Saxophone", "Particle Accelerator" }; 
    } 
} 
+0

Bien que ce soit ne surchargez pas que par définition, cette solution de modifier la valeur de la variable de membre de l'enfant est beaucoup plus élégant dans le cas où vous avez beaucoup de variables pour remplacer (un modèle de décorateur pour le soutien à thème, par exemple) . +1 – humbleSapiens

0

Si vous souhaitez imprimer le tableau de la chaîne String Stuff défini dans la classe dérivée, vous devez remplacer la méthode readStuff dans la classe HardStuff en redéfinissant la méthode dans la classe HardStuff. Comme la méthode readStuff était définie dans la classe abstraite BasicStuff, elle imprime uniquement les membres de la classe BasicStuff. Par conséquent, ajoutez la même méthode dans la classe Diète. Ci-dessous vous trouverez le code complet ..

class BasicStuff { 
    protected String[] stuff = { "Pizza", "Shoes" }; 

    public void readStuff() { 
      for(String p : stuff) { 
        System.out.println(p); 
      } 
    } 
} 


public class HardStuff extends BasicStuff { 
    protected String[] stuff = 
       { "Harmonica", 
       "Saxophone", 
       "Particle Accelerator" 
       }; 

    public void readStuff() { 
      for(String p : stuff) { 
        System.out.println(p); 
      } 
    } 
    public static void main(String []arg) 
    { 
    HardStuff sf = new HardStuff(); 
     sf.readStuff(); 
    } 
} 
Questions connexes