Zitat von
anda_skoa
Ich verstehe leider das Problem jetzt nicht mehr.
;o) habe ich befürchtet, ist wohl auch mit Code besser zur erklären, als mit worten. ich habe nur leider das Teil nicht hier.
Von deinem ursprünglichen Code ausgehend ist mein Ansatz wesentlich weniger Aufwand.
ja, dass ist richtig. das Beispiel ist klar vereinfacht, um die Struktur (nicht den Sinn) meines Problems klar zu machen. ich hänge heute Abend mal den richtigen Code an.
Worin besteht aus deiner Sicht der Unterschied zwischen Überschreiben einer Methode und Überschreiben eines Konstruktors?
gehen wir mal davon aus, dass ich eine Methode habe, die aus einem festen, generischen Teil A und einem variablen, veränderlichen Teil B besteht. dann möchte ich natürlich A nur einmal schreiben und B muss ich für jede Ableitung einzeln schreiben.
Ich wollte A als Konstruktor umsetzen, der dann B aufruft, so dass ich nur B schreiben muss.
Alternativ könnte ich nun entweder A als Konstruktor schreiben, der B als Parameter bekommt. Das will ich aber nicht, weil aus meiner Sicht schlechte Struktur.
Zuletzt kann ich A als Methode schreiben und B jeweils als Konstruktor, der dann A aufruft. Dass kommt dem, was ich möchte am nächsten, aht aber zwei Nachteile:
1) Ich muss die Methode A in jedem abgeleiteten Konstruktor explizit aufrufen --> rendundant, fehleranfällig, häßlich
2) Ich muss im Konstruktur Variable und Objekte initialisieren, was eigentlich zum fixen Teil A gehört --> wieder Redundanz.
Somit werde ich wohl dabei bleiben, dass ich den überflüssigen Konstruktor umsetze, der super() aufruft.
Ist nur eben schade, dass es mit JAVA nicht geht.
Code:
import javax.swing.JTable;
import javax.swing.table.*;
import java.util.Iterator;
import java.util.Vector;
import java.util.Date;
import java.math.BigDecimal;
import javax.swing.border.EmptyBorder;
abstract class RuleTable extends JTable {
GlobalProperties GP;
DefaultTableModel dtm;
String[] hs;
TableCellEditor[] tce;
DefaultTableCellRenderer[] dtcr;
RuleTable(GlobalProperties GP) {
EmptyBorder EB=new EmptyBorder(0,0,0,0);
dtm = new DefaultTableModel();
this.GP=GP;
initRuleTableColumns();
for (int i=0; i<hs.length; i++) {
dtm.addColumn( GP.localizeStr(hs[i]) );
}
setModel(dtm);
for (int i=0; i<hs.length; i++) {
dtcr[i].setBorder(EB);
getColumnModel().getColumn(i).setCellRenderer( dtcr[i] );
getColumnModel().getColumn(i).setCellEditor( tce[i] );
}
}
abstract void initRuleTableColumns();
public void addRow() {
Object[] o={new Date(), new BigDecimal(0d)};
dtm.addRow(o);
}
public void removeRow() {
int r=getSelectedRow();
dtm.removeRow(r);
if (r>1) {
setRowSelectionInterval(r,r);
} else {
clearSelection();
}
}
}
class CapitalRuleTable extends RuleTable {
CapitalRuleTable(GlobalProperties GP) {
super(GP);
}
void initRuleTableColumns() {
String[] hs = {"i18n_Valuta","i18n_Amount"}; this.hs=hs;
TableCellEditor[] tce={new DateTextField(GP), new DecimalTextField(GP)}; this.tce=tce;
DefaultTableCellRenderer[] dtcr={new DateCellRenderer(), new DecimalCellRenderer("#,##0.00")}; this.dtcr=dtcr;
}
}
Lesezeichen