J'essaie d'écrire une méthode d'usine dans une classe abstraite en Java (je veux donc que cela retourne une nouvelle instance de la classe extension, plutôt que la super-classe).
in php je ferais Ceci utilisant le mot-clé est que java a un mot clé comme auto code> p> auto code> je peux utiliser pour cela? p> p>
4 Réponses :
Je ne pense pas que cela soit possible dans Java de connaître le nom de la sous-classe "actuelle". Et surtout une certaine génération d'objet dynamique ne sera pas possible. P>
Vous devez donc définir cette fonction statique dans chaque sous-classe à la place. P>
non; En Java, les méthodes statiques ne sont pas héritées de la même manière que les méthodes non statiques. Une sous-classe aura les méthodes statiques de sa superclasse, mais lorsqu'elles exécutent, ils s'exécuteront dans le contexte de la superclasse - il n'y a donc pas de mot clé pouvant être utilisé dans des méthodes statiques pour déterminer quelle classe la méthode a été appelée.
Modifier: une formulation plus précise est que les méthodes statiques ne sont pas héritées du tout; Cependant, la langue nous permet d'utiliser basé sur ce que vous semblez Pour vouloir réaliser, vous voudrez peut-être mettre en œuvre le Modèle d'usine abstraite . Cela va approximativement comme celui-ci: p> sousclass.foo () code> pour appeler la méthode statique superclass.foo () code>. p> public abstract class Superclass {}
public class SubclassA extends Superclass {}
public class SubclassB extends Superclass {}
public abstract class AbstractFactory {
public abstract Superclass Create();
}
public class FactoryA extends AbstractFactory {
public Superclass Create() {
return new SubclassA();
}
}
public class FactoryB extends AbstractFactory {
public Superclass Create() {
return new SubclassB();
}
}
@Ross: Peut-être - dans quels contextes avez-vous besoin pour créer les instances (pourquoi avez-vous besoin de cette méthode au lieu d'utiliser directement les constructeurs de sous-classe directement)? Avez-vous déjà besoin de créer des instances sans savoir à l'avance quel genre de classe vous aurez besoin? Si tel est le cas, reportez-vous à la mise à jour des échantillons de code sur le motif d'abstrait; Sinon, ce modèle est probablement trop exclu. :-)
J'ai compris que tout le point est de faire la chose dynamique.
@Tada: S'il vous plaît expliquer; Où suis-je contredis-je? (J'ai suggéré le modèle d'usine abstraite parce que c'est ce que je pensais qu'il voulait réaliser, mais j'ai réalisé que peut-être qu'il avait peut-être une autre intention, alors je voulais simplement préciser que ce modèle n'est utile que dans certaines situations. Ou êtes-vous penser à autre chose?)
@tada: ah; Je suppose que vous parlez de mon bowvote de la réponse contenant une erreur de compilation; J'ai maintenant corrigé l'erreur (au moins celle que je pouvais repérer).
Vous avez besoin de hacks pour y parvenir. Une façon, je peux penser à obtenir ceci est:
Si vous êtes absolument avoir à fort> vous pouvez utiliser ce code formulaire un contexte statique: Votre classe doit avoir un constructeur nullaire. P> < / p>