10
votes

Quel est le mot-clé de soi de Java

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é auto xxx

est que java a un mot clé comme auto je peux utiliser pour cela?


0 commentaires

4 Réponses :


0
votes

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.

Vous devez donc définir cette fonction statique dans chaque sous-classe à la place.


0 commentaires

9
votes

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 sousclass.foo () code> pour appeler la méthode statique superclass.foo () code>. p>

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>

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();
    }
}


4 commentaires

@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).



2
votes

Vous avez besoin de hacks pour y parvenir. Une façon, je peux penser à obtenir ceci est: xxx


0 commentaires

3
votes

Si vous êtes absolument avoir à vous pouvez utiliser ce code formulaire un contexte statique: xxx

Votre classe doit avoir un constructeur nullaire. < / p>


0 commentaires