Wie implementieren Konstruktor für die erweiterte Klasse
Dies funktioniert:
class ABean implements A {
protected String field1;
...
protected String fieldn;
public String getField1() {
return field1;
}
...
}
class BBean extends ABean {
public BBean(A a) {
super();
this.field1=a.getField1();
...
this.fieldn=a.getFieldn();
}
}
Aber das schreiben dieser Konstruktor B(A a)
ist umständlich, nicht wirklich praktisch ist, und fehleranfällig, denn wenn ich auf hinzufügen oder entfernen von Feldern in A
, dann muss ich ändern, dass der Konstruktor und kann manchmal vergessen, initialisieren Sie einige der Felder, die im A
.
Ich nehme an, dass ich umsetzen konnte-Klon für ABean, aber das hätte ähnliche Probleme (da die clone-Implementierung aktualisiert werden müssen, wenn ich Felder hinzufügen/entfernen) und das würde auch nicht zulassen, dass Sie mich eine BBean(A a)
Konstruktor; nur ein BBean(ABean a)
Konstruktor, es sei denn, ich mache die clone()
Teil der Schnittstelle sind.
So... gibt es eine sauberere, bessere Art und Weise der Umsetzung BBean(A a)
?
Ich habe Zugriff auf beide Klassen. Ich bin beginnen zu realisieren, dass ich vielleicht jagt ein Gespenst. Nachdem alle, es gibt viele Methoden, die Liste Felder explizit, wie gleich, hashCode, toString sogar... und das muss geändert werden, wenn neue Felder Hinzugefügt/entfernt. Der einzige Unterschied ist, dass diese Methoden werden automatisch erzeugt und mit Eclipse. Also keine Zauberformel, aber 2 Ansätze: Liste aller Felder explizit und verschieben Sie den code in Einen mit dem Ein-Konstruktor-Methode, die Sie vorschlagen, um zumindest die Lokalisierung der Feld ändert, oder verwenden Sie reflektion, wie vorgeschlagen von Edgard. Immer noch Fragen...
InformationsquelleAutor Lolo | 2013-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstelle der Verwendung von Vererbung, versuchen Sie es mit Komposition. Das heißt, anstelle von
BBean extends ABean
, machen Sie IhreBBean
KonstruktorBBean(ABean a)
. So, Sie haben geschirmt, sich von all den details, wie der Bau einer neuenABean
imBBean
's code.Ich bin der Annahme Ihrer Antwort, da ich schrieb, dass die Frage, habe ich gefunden, dass die Verwendung der Zusammensetzung ist in der Regel was löst, die Arten von Problemen die meisten aus.
InformationsquelleAutor jacobm
Was über die Implementierung einer "Ein"-Konstruktor (copy-constructor) auf Ihrem ABean wie folgt:
Diesem Weg, Ihre "Kopie-Konstruktor" mapping für Eine ist ist alles in Ihren ABean.
Oh, wie ich sehe. Ich hatte angenommen, Sie wollten lokalisieren Sie das Feld ändert sich Weg von der client-Klassen (wie BBean), so dass Sie nicht haben, initialisieren Sie die Werte in den einzelnen.
Ok, nicht schön aber Häufig in Projekte mit großen BOs mit einer großen Anzahl von Eigenschaften... Sie konnte nur geben ABean eine Karte von Werten mit generic Map setter). Es gewährleistet, dass Ihre
BBean(A)
Konstruktor - oder einABean(A)
copy-Konstruktor - ist das nicht umständlich und keine neuen Werte werden vermisst. Natürlich, das bedeutet, dass die BO ist nicht mehr stark typisierte und ist nicht sehr OO. Man könnte natürlich ergänzen die Karte-Basis-API mit echten Accessoren für die bekannten Werte.InformationsquelleAutor wmorrison365
können Sie mithilfe von reflektion:
}
setzen Sie diese Methode im Unterricht Ein , und ändern Sie die Felder Wert direkt <br>
this.getClass().getDeclaredFields()[0].set(this, new String());
InformationsquelleAutor Edgard Leal