Qu'est-ce que Java est 'auto' mot-clé
Je suis en train d'écrire une usine de méthode dans une classe abstraite en Java (donc je veux renvoyer une nouvelle instance de la classe étendue, plutôt que de la super-classe).
En PHP je le ferais à l'aide de la self
mot-clé:
abstract class Superclass {
public static function factory($arg) {
return new self($arg);
}
private function __construct($arg) {}
abstract public function doSomething() {}
}
Java ont un mot clé comme self
je peux utiliser pour cela?
OriginalL'auteur Ross | 2011-05-26
Vous devez vous connecter pour publier un commentaire.
Pas; en Java, les méthodes statiques ne sont pas héritées de la même manière que les non-méthodes statiques sont. Une sous-classe d'avoir les méthodes statiques de sa super-classe, mais quand ils exécutent, ils exécutent dans le contexte de la super-classe - alors, il n'y a pas de mot-clé qui peut être utilisé dans des méthodes statiques pour savoir quelle classe, la méthode a été appelée par le biais d'.
Edit: Une formulation plus précise que les méthodes statiques ne sont pas héréditaire; cependant, la langue nous permet d'utiliser
Subclass.foo()
d'appeler la méthode statiqueSuperclass.foo()
.Basé sur ce que vous semblez vous voulez atteindre, vous pourriez vouloir mettre le Abstrait modèle de Fabrique. Il en va à peu près comme ceci:
Maintenant, vous pouvez par exemple créer une méthode qui prend un
AbstractFactory
(qui, en réalité, sera soit unFactoryA
ou unFactoryB
). L'appel deCreate()
sur cet objet va produire unSubclassA
ou unSubclassB
.Edit: correction d'une erreur de compilation (oublié pour que les usines de prolonger
AbstractFactory
).J'ai compris que tout l'intérêt est de faire la chose de dynamique.
Veuillez expliquer; où ai-je contredire moi-même? (J'ai proposé l'Abstrait modèle de Fabrique, parce que c'est ce que j'ai pensé qu'il voulait atteindre, mais ensuite j'ai réalisé que peut-être il avait une autre intention, donc je voulais juste préciser que ce modèle n'est utile que dans certaines situations. Ou êtes-vous penser à quelque chose d'autre?)
Ah; je suppose que vous faites allusion à mon downvote de la réponse contenant une erreur de compilation; j'ai maintenant corrigé l'erreur (au moins celle que j'ai pu observer).
OriginalL'auteur Aasmund Eldhuset
Si vous avez absolument ont pour vous pouvez utiliser cette forme de code un contexte statique:
Votre classe doit avoir un nullary constructeur.
OriginalL'auteur vbence
Vous avez besoin de quelques hacks pour atteindre cet objectif. D'une façon que je peux penser à obtenir c'est:
OriginalL'auteur Marcelo