2010-04-07 3 views
0

ÉDITÉE:Java étend les classes - Partager les champs de classe au sein de la super étendues classe

Droit au but ... J'ai une classe

public class P_Gen{ 
    protected String s; 
    protected Object oP_Gen; 
    protected Object oP_Gen2; 
    public P_Gen(String str){ 
     s = str; 
     oP_Gen = new MyClass(this); 
     oP_Gen2 = new MyClass2(this); 
    } 
} 

classe étendue:

public class P extends P_Gen{ 
    protected Object oP; 
    public P(String str){  
     super(str); 
     oP = new MyClass(this); 
    } 
} 

MyClass:

public class MyClass{ 
    protected Object oMC; 
    public MyClass(P extendedObject){ 
     this.oMC = extendedObject.oP; 
    } 
} 

MaClasse2:

public class MyClass2{ 
    protected Object oMC2; 
    public MyClass(P_Gen thisObject){ 
     this.oMC2 = thisObject.oP; 
    } 
} 

La classe P_Gen indiqué ci-dessus me donne une erreur pour la ligne:

oP_Gen = new MyClass(this); 

indiquant "ne peut pas trouver un constructeur de symbole MyClass (P_Gen)."

Ce que je veux accomplir est de rendre P.oP disponible de MyClass2.

Ma pensée initiale était que P.this === P_Gen.this. En d'autres termes, P_Gen disparaît lorsqu'il est appelé depuis super() et ce qui reste n'est que P la classe étendue.

+0

Ok ok, j'ai un tas de MyClass (1 .... x). Ils doivent tous être instanciés depuis P_Gen. Mais je veux qu'ils aient accès à P, pas seulement P_Gen. Est-ce possible? – Bastan

Répondre

0

ok,

  1. Dans la MaClasse2 de classe, le constructeur doit être nommé 'MaClasse2'
  2. Pourquoi plateau que ne pas vous définir les constructeurs comme ceci:
public MyClass(P_Gen thisObject){...} 
public MyClass2(P_Gen thisObject){...} 

En faisant cela, vous êtes en mesure de faire quelque chose comme:

new MyClass(new P()); 

Aussi, vous devez jeter thisObject-P l'intérieur MyClass et MyClass2 contructeurs, alors vous êtes en mesure d'obtenir la variable oP. Ma recommandation 4you est de reed un peu plus sur l'héritage java.

JP

0

Je suis un peu confus par votre question (et votre code, qui n'a pas de méthode doSomething() n'importe où), mais vous pourriez bénéficier de P_Gen étant une classe abstraite avec une méthode abstraite doSomething(). Alors P peut implémenter cette méthode, et tout ce qui a une référence à un P_Gen peut l'appeler (et obtenir l'implémentation dans P, si c'est l'instance).

+0

J'ai édité toute la question après avoir fait quelques tests de mon côté. J'espère que ça fait plus de sens. – Bastan

+0

Question de suivi: P_Gen.oP_Gen et P.oP sont-ils destinés à être le même objet? Ou est-ce qu'une instance de P doit avoir un oP et un oP_Gen? – nojo

+0

Ce que je veux dire avec cette dernière question: si elles sont destinées à être le même objet, alors P ne doit pas déclarer le membre oP, et vous pouvez accéder à oP_Gen sans aucune conversion. – nojo

0

Après une bonne nuit de sommeil .... Il est pas ce que je voulais faire ce qui est faux, mais mon approche tout à fait. Je suis retourné à mon début de POO. Honte sur moi. Quoi qu'il en soit, j'ai donné la réponse à @juanp parce qu'il a dit "Ma recommandation est de vous en dire un peu plus sur l'héritage java".

Pour ceux qui sont intéressés, voici ce qu'il devrait ressembler à:

La classe P_Gen générée:

public abstract class P_Gen{ 
    protected String s; 
    protected Object oP; 
    public P_Gen(String str){ 
     this.s = str; 
     init(str); 
    } 

    protected void init(String str){ 
     if(this instanceof P){ 
      oP = new MyClass((P)this); 
     } 
    } 
} 

La classe P étendu:

public class P extends P_Gen{ 
    public String sSTR; 
    public P(String str){ 
     super(str); 
    } 

    @Override 
    protected void init(String str){ 
     this.sSTR = str; 
     this.oP = new MyClass(this); 
    } 
} 

La classe MyClass:

public class MyClass{ 
    protected Object oMC; 
    public MyClass(P extendedObject){ 
     this.oMC = extendedObject.sSTR; 
    } 
} 

Ce que j'ai fait était de déplacer l'instanciation MyClass du constructeur vers une fonction init. Cette fonction init est alors surchargée dans la classe étendue ..... des trucs très basiques je sais.

Encore plus basique, j'ai ajouté un résumé à ma classe P_Gen pour l'empêcher d'être instancié directement. Je pourrais aussi déclarer une méthode init abstraite dans P_Gen. Tout cela me fait penser que peut-être .... :-) ... un autre jour. Merci de m'avoir aidé à me remettre sur les rails.

Questions connexes