En passant super-classe de l'objet en tant que paramètre au constructeur de sous-classe (java)
J'ai fait un peu de recherche, mais je suis pas poser la bonne question ou de ne pas se souvenir correctement. En tout cas, en Java, je me demande si il est possible de passer la super-classe de l'objet en tant que paramètre à une sous-classe, et que le moyen le plus efficace de faire de l'objet de données disponibles pour la classe de super-classe.
Exemples de Code:
public class superclass {
String myparm1;
String myParm2;
int myParmN;
public superclass(String p1, String p2, int pn)
{
this.myparm1 = p1;
this.myparm2 = p2;
this.myParmN = pn;
}
//other methods here
}
public class subclass extends superclass {
double b1;
double b2;
public subclass(superclass sc, double b1, double b2) {
//easy way to make sc data available to this class?
//Do I create a copy or clone method, or some other way?
//calling super(sc); wouldn't exactly work
this.b1 = b1;
this.b2 = b2;
}
}
si j'avais un constructeur de la superclasse qui a été public superclass(superclass sc) { //assign sc properties to this properties, correct? }
alors je pourrais simplement utiliser super(sc);
Si le constructeur de la superclasse attend deux Chaînes de caractères et un entier (int), vous devez appel à super() avec 2 Cordes et un int. Il n'y a pas moyen de contourner cela. Si ces 3 valeurs sont exposés par
Pourquoi ne pas vous
Raffaele. Bien sûr, avec un petit nombre de propriétés, c'est facile. Mais en supposant que ma classe a un grand nombre de propriétés. (Il peut être mauvais design dans ce cas, bien sûr, mais je m'égare.)
Si votre classe mère a un grand nombre de propriétés, il devient de plus en plus important d'encapsuler les détails de la copie. Pouvez-vous ajouter un constructeur de copie dans le
sc
, puis la faire, et apsss à super().Pourquoi ne pas vous
super(sc.p1, sc.p2, sc.p3)
?superclass(superclass sc)
? L'appel de super(sc)
ne marche même pas alors, car il n'y a pas un Object
constructeur avec superclass
en tant que paramètreRaffaele. Bien sûr, avec un petit nombre de propriétés, c'est facile. Mais en supposant que ma classe a un grand nombre de propriétés. (Il peut être mauvais design dans ce cas, bien sûr, mais je m'égare.)
Si votre classe mère a un grand nombre de propriétés, il devient de plus en plus important d'encapsuler les détails de la copie. Pouvez-vous ajouter un constructeur de copie dans le
superclass
de la classe, de la forme que vous notez à la fin de votre question -- public superclass(superclass sc)
?
OriginalL'auteur Machtyn | 2016-01-15
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de point de passage dans une référence à la super-classe d'un objet dans le constructeur. Votre sous-classe est déjà une instance de la super-classe.
Même si vous ne pouvez pas voir directement les éléments privés de la super-classe, mais ils existent toujours et les appels aux méthodes accesseur public sera toujours produire un comportement normal.
En réponse à votre deuxième question, le moyen le plus efficace d'accéder aux données à l'intérieur de la classe parent est avec l'accesseur méthodes de la classe parent. Si elle a obtenir/définir les propriétés des méthodes qui peuplent certaines données de la structure complète de propriétés, il suffit d'appeler ces méthodes à partir de votre enfant en classe et qu'ils vont travailler exactement la même que pour le parent. Maintenant, si ces structures de données internes sont remplies par le constructeur de la classe parent, vous aurez à invoquer que le constructeur avec la bonne méthode, lorsque vous créez une instance de l'enfant du constructeur qui en a besoin - généralement en appelant un des super() au début de l'enfant du constructeur.
Si vous êtes en essayant de contourner la restriction que vous ne pouvez pas voir les parties intimes de la super-classe, java intentionnellement de ne pas vous laisser faire ça. Vous pouvez obtenir autour de cette réflexion, sauf si vous êtes coincé à l'intérieur d'un environnement d'exécution n'autorise pas cela, mais je ne considère pas cela d'un coffre-fort ou une approche élégante.
De commentaire ci-dessous, je comprends ce que l'OP est en train de faire et cela devrait fonctionner, même si évidemment ça dépend de votre capacité à apporter des modifications à la super-classe:
Si vous êtes essayant de trouver un moyen de prendre un déjà instancié instance de la super-classe, passer au constructeur de la classe fille et de l'utilisation que parent d'instance dans le cadre de l'initialisation, qui prend place dans l'enfant du constructeur?
Correct, Jim. Déjà instancié instance. Et, je suis d'accord avec votre dernier relevé. Si mon super-classe a données privées non exposés (et doit rester de cette façon), il serait de mauvaise conception pour le constructeur de copie d'essayer et de refléter le fait que les données.
À moins que la super-classe est écrit explicitement que cela puisse se produire (c'est à dire un constructeur qui prend une autre instance de la même classe et de copie des pièces), ce n'est pas quelque chose que java soutient naturellement. Vous pourriez faire cela avec quelque chose comme " public Super (Super Super) (//copie sur les champs de super) et ensuite dans les enfants de la classe, vous auriez quelque chose comme ce public Enfant (Super Super) {super(super); ....}
OriginalL'auteur Jim W
Vous ne pouvez pas. Lorsque vous créez un objet avec Java (par exemple avec
new
), cette instance a une classe, et que la classe a un parent (éventuellement de l'Objet).La relation parent-enfant contient seulement entre les classes, entre les objets! Aucun objet n'a objet parent (au moins, pas au niveau du langage) - de sorte que vous ne pouvez pas accepter le parent dans le constructeur et le stocker dans certaines Java une place définie.
Cependant votre domaine peut avoir le parent et l'enfant entités, dans ce cas vous avez besoin des champs ou des structures de données pour stocker les liens entre eux.
superclass
objet, et qui veut l'utiliser pour initialiser la superclasse le cadre d'une nouvellesubclass
objet. C'est possible, disposer d'une superclasse constructeur.Mais alors il suffit d'utiliser
super(arg.p1, arg.p2, ...)
- j'ai déjà demandé que, dans mon commentaire à la question d'origineOriginalL'auteur Raffaele
De répondre à une question précédente, on suppose que la super-classe a grand nombre de propriétés. Dans ce cas, la conception de la classe peut être mauvais, bien sûr.
Peut-être la meilleure réponse est:
De cette façon, la sous-classe peut simplement appeler la
super.copy(sc)
. Bien sûr, j'aurais besoin d'un autre constructeur de la superclasse qui permettra de définir les valeurs par défaut:public superclass() { //set defaults }
Sorte de sous-classe pourrait être:
De cette façon, je suis le seul à avoir le type de ces paramètres, et toutes les sous-classes qui serait prêt à accepter une super-classe de l'objet n'aurez pas à définir la structure de chacun et de tous les temps. (moins de frappe, moins de chance pour que l'erreur ou l'oubli de quelque chose.)
Andy, je vous remercie de me pointer dans la bonne direction et, enfin, poser la bonne question. Copie constructeurs: javapractices.com/topic/TopicAction.do?Id=12
OriginalL'auteur Machtyn