2017-01-06 1 views
2

J'ai quelques sous-classes avec des variables statiques uniques dans ce cas appelé 'x'. Toutes ces sous-classes utilisent la variable statique de la même manière, donc je veux réduire la duplication de code et mettre la fonctionnalité dans la super classe. Dans ce cas, la méthode 'getX' dans la super classe. De là, je veux retourner la valeur de x. En ce moment je suis confronté au problème qu'il utilise la valeur x de la super classe et non la valeur de la classe enfant. Comment puis-je accéder à la valeur x de la sous-classe de la super classe?Java | vars statiques dans la classe parent et enfant | accéder à la valeur var de l'enfant de la classe parent

public class Playground { 

    public static void main(String[] args) { 
    Parent parent = new Parent(); 
    Child child = new Child(); 
    Child1 child1 = new Child1(); 

    System.out.println("Parent.x " + parent.x); 
    System.out.println("child.x " + child.x); 
    System.out.println("child.x " + child1.x); 

    System.out.println("get x: " + parent.getX()); 
    System.out.println("get x: " + child.getX()); 
    } 
} 

class Parent { 
    static String x = "static of parent"; 
    String y = "instance of parent"; 

    String getX() { 
     return x; 
    } 
} 

class Child extends Parent { 
    static String x = "static of child"; 
    String y = "instance of child"; 
} 

class Child1 extends Parent { 
    static String x = "static of child1"; 
    String y = "instance of child"; 
} 

Ce code imprime: Parent.x static of parent child.x static of child child.x static of child1 get x: static of parent get x: static of parent< - ici devrait être statique de l'enfant

quelqu'un Hope peut me aider.

À votre santé

Répondre

2

Essayez d'ajouter la méthode getX à l'enfant. Comme ceci:

class Child extends Parent { 
    static String x = "static of child"; 
    String y = "instance of child"; 
    String getX() { 
     return x; 
    } 
} 
+0

Dans mon vrai scénario que j'ai 6 sous-classes, donc je ne veux pas copier getX qui sont 3-4 méthodes (dans le scénario réel) dans tous les sous classes –

+0

Mais lorsque vous appelez la méthode getX, java appelle celle de Parent. C'est pourquoi vous obtenez le x du parent. Je pense que c'est le seul moyen d'obtenir le résultat attendu. –

1

Ajoutez la méthode getX dans la classe enfant. La méthode parent getX pointe sur la variable statique de la classe parente.

1

Qu'est-ce que vous essayez est une violation du principe de base POO cacher l'information/encapulation.

Aucune autre classe devrait savoir sur la façon dont une classe stocke ou traite ses propriétés (aka les variables ou champs). Cela comprend que clases ne devraient pas avoir getter et setter (comme suggéré par @ RosárioPereiraFernandes)

Il y a une exception à cette règle lorsque la classe représente un objet de transfert de données (DTO) qui a (presque) pas de logique métier et fournit uniquement l'accès aux données structurées. Les DTO doivent avoir getters et (moins souvent) setters.

D'autres classes devraient fournir des méthodes avec busines noms liés à modifier leur état intérieur (les valeurs de leurs variables membres):

class Car{ 
    private final int maxSpeedInMph = 100; 
    private int speedInMph = 0; 
    public void accellerateBy(int speedDiffInMph){ 
    if(maxSpeedInMph >=speedInMph + speedDiffInMph) 
     speedInMph += speedDiffInMph; 
    else 
     speedInMph = maxSpeedInMph ; 
    }  
    public void accellerateTo(int newSpeedInMph){ 
    if(maxSpeedInMph >= newSpeedInMph) 
     speedInMph = newSpeedInMph; 
    else 
     speedInMph = maxSpeedInMph ; 
    } 
    public void decellerateBy(int speedDiffInMph){ 
    if(0<=speedInMph - speedDiffInMph) 
     speedInMph += speedDiffInMph; 
    else 
     speedInMph = 0; 
    } 
    public void emengencyBreak(){ 
    speedInMph = 0; 
    } 
    // you get the idea? 
} 
+0

Je comprends, mon cas, chaque enfant a une constante unique que je veux utiliser. Il n'y a pas de manipulation. Pensez à une banque avec différents types de comptes bancaires et chaque type de compte bancaire a un compte bancaire constant. Donc je veux avoir une méthode qui retourne le BankFee pour chaque BankAccount sans aller dans chaque BankAccount enfant et ajouter un getter qui retourne les types BankFee. –

+0

@ DΦC__WTF: * "Mon cas, chaque enfant a une constante unique que je veux utiliser" * Pourquoi? - Très probablement vous prévoyez de l'utiliser dans les déclarations 'swich'. Mais vous devriez plutôt utiliser * plymorphism * pour faire des actions spécifiques basées sur un type de classe. –

1

Une solution pourrait être de ne pas avoir statique dans le parent, mais une instance champ.

class Parent{ 
    private final X x 
    public Parent(X x){ 
     this.x = x; 
    } 

    public X getX() { 
     return x; 
    } 
} 

Ensuite, votre enfant, vous pouvez toujours avoir une statique, mais vous le transmettre au constructeur

class Child extends Parent { 
    static final X x = .... 
    public Child() { 
     super(x); 
    } 
} 
1

Pour autant que je sais qu'il est impossible d'accéder à l'enfant-variables du parent -classe.

Mais vous pouvez remplacer String getX() dans la classe enfant

@Override 
protected String getX() {   
    return x; 
} 

Ensuite Java appelle le "plus bas" getX() méthode


Je coderez votre autre exemple:

public class Playground { 

private static Parent parent = new Parent("static of parent"); 
private static Child child = new Child("static of child"); 
private static Child1 child1 = new Child1("static of child1"); 

    public class Playground { 

private static Parent parent = new Parent("static of parent"); 
private static Child child = new Child("static of child"); 
private static Child child1 = new Child("static of child1"); 

    public static void main(String[] args) { 


    System.out.println("Parent.x " + parent.getX()); 
    System.out.println("child.x " + child.getX()); 
    System.out.println("child.x " + child1.getX()); 

    System.out.println("get x: " + parent.getX()); 
    System.out.println("get x: " + child.getX()); 
    } 
} 

class Parent { 
    private String x; 
    public Parent(String x) { 
     this.x = x; 

    } 

    public String getX() { 
      return this.x; 
     } 
} 

class Child extends Parent { 
    protected Child(String x) { 
     super(x); 
    } 
} 

-> ceci donnera la sortie suivante:

Parent.x static of parent 
child.x static of child 
child.x static of child1 
get x: static of parent 
get x: static of child 

Il suffit de demander si vous avez des questions