私は拡張するクラスを持っていますDataRow
:
import org.jdesktop.dataset.DataRow;
public class MainDataRow extends DataRow {
private MainDataTable baseDataTable;
protected MainDataRow(MainDataTable dt) {
super(dt);
this.baseDataTable = dt;
}
public int getId() { return (int) super.getValue(baseDataTable.getColId()); };
public void setId(int id) { super.setValue(baseDataTable.getColId(), id); };
public int getDelta() { return (int) super.getValue(baseDataTable.getColDelta()); };
public void setDelta(int delta) { super.setValue(baseDataTable.getColDelta(), delta); };
public String getNombre() { return (String) super.getValue(baseDataTable.getColNombre()); };
public void setNombre(String nombre) { super.setValue(baseDataTable.getColNombre(), nombre); };
また、 をMainDataTable
拡張し、 、、DataTable
の有効な列を返します。getColId()
getColDelta()
getColNombre()
私はやりたい:
MainDataTable dt = new MainDataTable(ds);
MainDataRow dr = (MainDataRow) dt.appendRow();
しかし、これはCastClassException
( dt.appendRow
returnDataRow
とMainDataRow
is extendsDataRow
であり、その逆ではありません。そのため、唯一の可能性は に似たものである可能性がありますDataRow dr = (DataRow) new MainDataRow(dt);
)。
C++ では、 inをオーバーライドし、保護された作成者をinからDataRowBuilder
オーバーライドすることで簡単に実現できます( DataRow を厳密に型指定された DataRow にキャストする: How do they do it? )。NewRowFromBuilder()
MainDataTable
DataRowBuilder
MainDataRow
Javaでどうすればできますか?
編集
MainDataTable クラス:
public class MainDataTable extends TypedDataTable<MainDataRow> {
...
}
TypedDataTable クラス:
public abstract class TypedDataTable<TypeOfRow> extends DataTable {
protected boolean locked;
public TypedDataTable(DataSet ds, boolean appendRowSupported) {
super(ds);
InitClass();
super.setAppendRowSupported(appendRowSupported);
locked = false;
}
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
@Override
public abstract DataRow appendRow();
@Override
public abstract DataRow appendRowNoEvent();
public abstract void InitVars();
public abstract void InitClass();
public boolean isLocked() {
return locked;
}
public void setLocked(boolean locked) {
this.locked = locked;
}
}