Vorbei Superklasse object als parameter an Unterklasse-Konstruktor (in java)
Ich habe mich ein bisschen auf der Suche, aber ich bin entweder stellst die richtige Frage, oder nicht richtig erinnern. In jedem Fall, in Java, Frage ich mich, ob es möglich ist, pass der super-Klasse-Objekt als parameter an eine Unterklasse und was die effizienteste Art und Weise zu machen, das Objekt die Daten zur Verfügung, um die Klasse super-Klasse.
Code-Beispiele:
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;
}
}
wenn ich einen Konstruktor in der Superklasse, war public superclass(superclass sc) { //assign sc properties to this properties, correct? }
dann könnte ich die einfach verwenden super(sc);
- Wenn der superclass-Konstruktor erwartet zwei Strings und ein int ist, müssen Sie den Aufruf super() mit 2 Strings und ein int. Es gibt keine Möglichkeit um ihn herum. Wenn diese 3 Werte ausgesetzt sind, durch
sc
, dann bekommen Sie, und apsss Sie super(). - Warum gehst du nicht
super(sc.p1, sc.p2, sc.p3)
? superclass(superclass sc)
? Aufrufsuper(sc)
gar nicht funktioniert, dann weil es keinObject
Konstruktor mitsuperclass
als parameter- Raffaele. Natürlich, mit einer kleinen Anzahl von Eigenschaften, das ist einfach. Aber angenommen, meine Klasse hat eine große Anzahl von Eigenschaften. (Es kann sein bad-design in diesem Beispiel natürlich, aber ich schweife ab.)
- Wenn Ihre Oberklasse hat eine große Anzahl von Eigenschaften, wird es immer wichtiger, zu Kapseln, die details zu kopieren. Hinzufügen Sie können eine Kopie-Konstruktor in der
superclass
Klasse, von der form, die Sie am Ende Ihrer Frage --public superclass(superclass sc)
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Macht es keinen Sinn, zu übergeben eine Referenz auf die Superklasse ein Objekt in den Konstruktor. Ihre Unterklasse ist bereits eine Instanz der Superklasse.
Obwohl Sie nicht direkt sehen, die privaten Komponenten der Oberklasse, aber Sie noch vorhanden sind und fordert öffentliche accessor-Methoden produziert weiterhin normal Verhalten.
In der Antwort auf Ihre zweite Frage, die auf effiziente Weise Zugang zu den Daten innerhalb der übergeordneten Klasse mit der accessor-Methoden der übergeordneten Klasse. Wenn es get - /set-Eigenschaften-Methoden, füllen einige Daten-Struktur voll von Eigenschaften, rufen Sie diese Methoden von Ihrem Kind Klasse und Sie funktionieren genau das gleiche wie für die Eltern. Nun, wenn die internen Daten Strukturen sind bevölkert von den Konstruktor der übergeordneten Klasse, Sie haben auf den Aufruf der Konstruktor mit den richtigen Methoden beim erstellen eine Instanz der Kind-Konstruktor, der Sie braucht - in der Regel durch aufrufen der entsprechenden super() am Anfang der Kindes-Konstruktor.
Wenn Sie versuchen, um die Einschränkung zu umgehen, dass Sie nicht sehen können, die private-Teile der Oberklasse java-absichtlich lässt Sie nicht tun. Sie können dies umgehen, mit Reflexion, es sei denn, Sie stecken in einer Ausführungsumgebung, die verbietet, aber ich in der Regel würde das nicht als eine sichere oder eleganten Ansatz.
Kommentar unten, ich verstehe, was der OP versucht zu tun, und das sollte funktionieren, obwohl es offensichtlich von Ihrer Fähigkeit abhängt, um änderungen an der super-Klasse:
Können Sie nicht. Wenn Sie bauen ein Objekt mit Java (z.B. mit
new
), dass die Instanz einer Klasse, und diese Klasse hat ein Elternteil (ggf. Objekt).Den Eltern-Kind-Beziehung hält nur zwischen Klassen, nicht zwischen Objekten! Kein Objekt hat eine übergeordneten Objekt (zumindest nicht an der Sprache - Niveau), so dass Sie können nicht akzeptieren, den Eltern im contructor und speichern Sie es in einigen Java-definierten Ort.
Jedoch Ihre domain haben kann übergeordnete und untergeordnete Einheiten, in diesem Fall müssen Sie Felder oder Datenstrukturen zu speichern, die verbindungen zwischen Ihnen.
superclass
Objekt, und will ihn zur Initialisierung der Superklasse Teil einer neuensubclass
Objekt. Das ist möglich, da eine geeignete superclass-Konstruktor.super(arg.p1, arg.p2, ...)
- ich habe bereits darum gebeten, dass in meinem Kommentar auf die ursprüngliche FrageZur Beantwortung einer vorhergehenden Frage an, dass die Oberklasse hat große Anzahl von Eigenschaften. In diesem Fall ist der Entwurf der Klasse kann schlecht sein, natürlich.
Vielleicht die beste Antwort ist:
So, die sub-Klasse kann einfach anrufen, die
super.copy(sc)
. Natürlich, ich bräuchte einen anderen Konstruktor in der Superklasse, wird Sie set defaults:public superclass() { //set defaults }
Also Unterklasse könnte:
In dieser Weise, ich bin nur geben Sie diesen Parameter aus, und alle Unterklassen, die würden wollen, anzunehmen, ein Oberklasse-Objekt nicht definieren, die Struktur, die jeder Zeit. (weniger Tippen, weniger Chancen für Fehler oder vergessen etwas.)