Comment implictly appel constructeur de la classe parent
Je veux faire la chose suivante:
class P {
P(int a) {
//construct
}
}
class C extends P {
}
//in main
int a = 2;
C foo = new C(a); //can I do this?
Je veux créer un enfant de l'objet C en appelant le parent de la classe P du constructeur sans écrire aucun constructeur dans la classe C comme "super(un)". Est-ce possible?
L'idée, c'est que j'ai beaucoup de classe comme "classe C", qui a besoin du même constructeur fonctionnalités comme "classe P". Donc je ne veux pas écrire un constructeur méthode à chaque fois que je créer une nouvelle catégorie similaire.
Grâce
Vous ne pouvez pas appeler un constructeur avec un argument sans écrire un constructeur qui prend en argument. Votre question n'a pas de sens.
OriginalL'auteur Linghua Jin | 2013-08-26
Vous devez vous connecter pour publier un commentaire.
Les constructeurs ne sont pas héritées. Vous aurez besoin de déclarer un constructeur en
C
qui prend un argument. Il aura besoin d'invoquer l'appropriées constructeur de la superclasse (si vous ne voulez pas le défaut constructeur de la superclasse être appelé).Le seul constructeur, vous pouvez éviter de déclarer est la valeur par défaut, non-arg constructeur, et seulement si vous déclarez pas les constructeurs. C'est parce que le compilateur va générer pour vous si vous n'avez pas les constructeurs déclarés. Le compilateur insère toujours un appel à la valeur par défaut constructeur de la superclasse, sauf si vous explicitement appeler un constructeur de la superclasse.
Notez également que si vous n'appelez pas explicitement un constructeur de la superclasse et il n'y a pas de constructeur par défaut de la classe mère, vous obtiendrez une erreur de compilation.
EDIT: Si vous avez "beaucoup de classes comme la classe C", une alternative à l'écriture de beaucoup de constructeurs est d'utiliser un méthode de fabrique de modèle. Vous pouvez avoir toutes les classes implémenter un constructeur par défaut et de fournir un distinct
init()
méthode qui prend un ensemble standard d'arguments. La méthode de factorisation d'accepter uneClass<? extends C>
objet et des arguments d'initialisation, de générer une nouvelle instance (en utilisant le constructeur par défaut), et fait appel à soninit
méthode avec l'initialisation des arguments. De cette façon, vous avez seulement besoin de remplacer lainit
méthode pour les sous-classes qui ont des besoins spéciaux de manutention (toujours se souvenir de l'appel par le biais desuper.init
).Je l'avais mis
init
dansB
. Aussi, l'usine de la méthode une méthode générique enB
; vous n'avez pas besoin d'une classe à part.C
etD
n'aurait pas besoin de remplacerinit
pour le bien de l'initialisation dea
(bien qu'ils pourraient vouloir pour les autres initialisation).merci,mais si l'usine méthode motif doit utiliser la classe usine pour produire de l'instance ou d'appel de new B() et ainsi de suite omettre méthode init
L'idée est de passer
B.class
comme un véritable argument de la méthode de fabrique. Il utilise en interneclassArg.newInstance()
plutôt que de lanew
à l'opérateur de créer une instance de ce que la classe a été adoptée. Explicitement le codage de la classe pour être instancié défaites le but de présenter l'utilisation de tout type de modèle de fabrique.oui,l'utilisation classArg.newInstance(),mais aussi besoin d'appeler méthode init après que
OriginalL'auteur Ted Hopp
Donc,dans votre cas, la Classe
C
a un constructeur par défaut qui chercheraient à implicitement appel du constructeur par défaut de la ClasseP
qui n'existent pas et ne permettrait pas.Donc,vous avez à le faire de cette façon
ohh oui..en effet..c'est applicable à tout constructeur..modifié le sna..thx
Eh bien.. nous devons également noter que super(x) doit être la première ligne, chez l'enfant, le constructeur de la classe.
OriginalL'auteur Anirudha