Question

J'ai écrit la question comme un commentaire dans le code, je pense qu'il est plus facile de comprendre cette façon.

public class Xpto{
    protected AbstractClass x;

    public void foo(){

       // AbstractClass y = new ????? Car or Person ?????

       /* here I need a new object of this.x's type (which could be Car or Person)
          I know that with x.getClass() I get the x's Class (which will be Car or 
          Person), however Im wondering how can I get and USE it's contructor */

       // ... more operations (which depend on y's type)
    }

}

public abstract class AbstractClass {
}

public class Car extends AbstractClass{
}

public class Person extends AbstractClass{
}

Toutes les suggestions?

Merci à l'avance!

Était-ce utile?

La solution

Tout d'abord, BalusC est juste.

En second lieu:

Si vous les décisions de prise en fonction du type de classe, vous n'êtes pas laisser le polymorphisme faire son travail.

Votre structure de classe peut comporter des erreurs (voiture et personne ne devrait pas être dans la même hiérarchie)

Vous pourriez probablement créer une interface et le code à lui.

interface Fooable {
     Fooable createInstance();
     void doFoo();
     void doBar();
}

class Car implements Fooable {
     public Fooable createInstance() {
          return new Car();
     }
     public void doFoo(){
         out.println("Brroooom, brooooom");
     }
     public void doBar() {
          out.println("Schreeeeeeeekkkkkt");
      }
}
class Person implements Fooable {
     public Fooable createInstance(){   
         return new Person();
      }
      public void foo() {
           out.println("ehem, good morning sir");
      }
      public void bar() {
          out.println("Among the nations as among the individuals, the respect for the other rights means peace..");// sort of 
      }
}

Plus tard ...

public class Xpto{
    protected Fooable x;

    public void foo(){
         Fooable y = x.createInstance();
         // no more operations that depend on y's type.
         // let polymorphism take charge.
         y.foo();
         x.bar();
    }
}

Autres conseils

Si la classe a une valeur par défaut (implicite) constructeur sans arg, alors vous pouvez simplement appeler Class#newInstance() . Si vous souhaitez obtenir un constructeur spécifique, puis utilisez Class#getConstructor() dans laquelle vous passez les parametertypes à puis appelez Constructor#newInstance() sur elle. Le code en bleu sont en fait des liens, cliquez dessus pour obtenir le Javadoc, il contient des explications détaillées sur ce qu'est exactement la méthode fait.

Pour en savoir plus sur la réflexion, à la tête tutoriel Sun sur la sujet .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top