Ajuda para aproveitar código em classe abstrata

3 respostas
R

Abaixo tenho uma classe abstrata e uma que herda a abstrata.
Eu sempre terei uma lista que será as linhas. E o método getRowCount() sempre será igual. Como eu poderia colocar essas coisas que sempre irão acontecer na classe abstrata? A classe dos objetos da lista sempre irá mudar. Pode ser ou , etc. Teria alguma forma de colocar algum código na abstrata e ainda poder informar na subclasse o tipo da lista?

public class TableModelOrcamento extends TableModelPadrao {
	
	private List<Orcamento> linhas;

	public int getRowCount() {
		if (linhas != null) {
			return linhas.size();
		} else {
			return 0;
		}
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		switch (columnIndex) {
			case 0: return linhas.get(rowIndex).getData(); 
			case 1: return linhas.get(rowIndex).getValorTotal();
			default: return null;
		} 
	}

	public void setLinhas(List<Orcamento> linhas) {
		this.linhas = linhas;
	}

	public List<Orcamento> getLinhas() {
		return linhas;
	}

	@Override
	protected String[] criarColunas() {
		return new String[]{"Data", "Total"};
	}

}
public abstract class TableModelPadrao extends AbstractTableModel {
	
	protected String[] colunas;
	
	public TableModelPadrao() {
		setColunas(criarColunas());
	}
	
	public int getColumnCount() {
		return colunas.length;
	}	
	
	public boolean isCellEditable(int row, int col) {
		return false;
    }	
	
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }		
	
	public String getColumnName(int col){
		return colunas[col];
	}

	public String[] getColunas() {
		return colunas;
	}
	
	public void setColunas(String[] colunas) {
		this.colunas = colunas;
	}
	
	protected abstract String[] criarColunas();
		
}

3 Respostas

_fs
public abstract class TableModelPadrao < T > {
 	protected List<T> linhas;
}

public class TableModelOrcamento extends TableModelPadrao< Orcamento > {}

public class TableModelPessoal extends TableModelPadrao< Pessoa > {}
R

Em que local da especificação ou da api do java posso ver como eu posso utilizar esse parâmetro ?
O T é alguma classe? Está declarado em algum local?
Parece que pode ser qualquer letra, não é?

R
Eu fiz o seguinte. Criei uma classe Persistente e fiz todos os POJO persistentes herdarem dela. Então eu declarei a classe assim: public abstract class TableModelPadrao extends AbstractTableModel Aparentemente deu certo, mas na prática ainda não está 100% funcionando. Veja minha subclasse:
public class TableModelOrcamento<Orcamento> extends TableModelPadrao {
	
	public Object getValueAt(int rowIndex, int columnIndex) {
		switch (columnIndex) {
			case 0: return linhas.get(rowIndex).getData(); 
			case 1: return linhas.get(rowIndex).getValorTotal();
			default: return null;
		} 
	}

	@Override
	protected String[] criarColunas() {
		return new String[]{"Data", "Total"};
	}
}
Eu esperava que linhas.get() retornasse meu objeto Orcamento. Ou pelo menos o Persistente. Tem algo errado? O getData e o getValorTotal são métodos da classe Orcamento.
public abstract class Persistente {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }	
	
}

public abstract class TableModelPadrao<T extends Persistente> extends AbstractTableModel {
	
	protected String[] colunas;
	protected List<T> linhas;	
	
	public TableModelPadrao() {
		setColunas(criarColunas());
	}
	
	public int getRowCount() {
		if (linhas != null) {
			return linhas.size();
		} else {
			return 0;
		}
	}	
	
	public int getColumnCount() {
		return colunas.length;
	}	
	
	public boolean isCellEditable(int row, int col) {
		return false;
    }	
	
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }		
	
	public String getColumnName(int col){
		return colunas[col];
	}

	public String[] getColunas() {
		return colunas;
	}
	
	public void setColunas(String[] colunas) {
		this.colunas = colunas;
	}
	
	protected abstract String[] criarColunas();

	public List<T> getLinhas() {
		return linhas;
	}

	public void setLinhas(List<T> linhas) {
		this.linhas = linhas;
	}
}
Criado 30 de março de 2005
Ultima resposta 30 de mar. de 2005
Respostas 3
Participantes 2