Extender classe

11 respostas
J

Tenho duas classes, uma delas é a classe mae e a outra seria a classe extendida
entro da classe mae, tenho instanciado uma outra classe que tem os metodos que eu preciso.

public class CriaGrid {
   private void loadDynamicList() throws SQLException {
      TelaLinha tipoTelas = new TelaLinha();
   }
}

e na classe filha que gostaria de mudar o valor desse “tipoTelas”, para que ele recebesse outra classe, já que o nome dos metedos nao muda

public class GridTeste extends CriaGrid{
	private TelaTeste tipoTelas = new TelaTeste();
}

mas nao funciona fazendo desse jeito, pois toda vez que entra no metodo loadDynamicList() ele volta a ter o mesmo valor.
Como que faço para alterar o valor dessa variavel “tipoTelas”?

11 Respostas

nel

1 - Se você declara um método como private, nenhuma outra classe vai ter acesso a ela (esqueça reflection), mesmo que a classe seja “filha”

2 - O ideal, acredito eu, seria que o seu método recebesse um parametro do tipo TelaLinha, de forma que você possa alterar como desejar, caso contrário, deve mudar a sua lógica.

Abraços.

jimmyhc

nel:
1 - Se você declara um método como private, nenhuma outra classe vai ter acesso a ela (esqueça reflection), mesmo que a classe seja “filha”

2 - O ideal, acredito eu, seria que o seu método recebesse um parametro do tipo TelaLinha, de forma que você possa alterar como desejar, caso contrário, deve mudar a sua lógica.

Abraços.

Concordo com o nel… E acrescento:

  • " pois toda vez que entra no metodo loadDynamicList() ele volta a ter o mesmo valor."

Pq toda vez que chama o método loadDyn…() tu ta instanciando o TelaLinha

J

Mas ai que ta a minha duvida, eu nao sei como eu posso faze para que eu consiga mudar esse parametro?
se eu declarar tanto quanto private, como public, nao funciona tentando passar a minha classe extendida um novo valor, pois ai entra na situaçao que ao entrar no metodo ele recebe o valor novamente.

Nunca fiz isso de trabalhar mudando esse parametro da minha classe extendida

adriano_si

Mas hoje voce nao tem parametro… Tem que incluir um parametro no teu metodo…

tipo loadDinamyc(TelaLinha tipoTela) throws … {}

Se nao quiser assim, muda tua logica como indicou o nel

nel

Certo.

Se o que você precisa é apenas alterar este valor, porque esta classe tem que ser filha? Uma classe filha tem o intuito de possuir acesso aos mesmos métodos que sua classe Pai, podendo utilizar de overriding e etc, não preciso entrar em detalhes.

Na minha humilde opinião, não precisa de uma classe filha, porque não tenta algo assim:

public class CriaGrid {   
   public void loadDynamicList(TelaLinha tipoTelas) throws SQLException {   
      //Aqui voce tem o parametro tipoTelas, basta aplicar sua lógica
   }   
}

E na sua outra classe, instancie e passe o valor, algo assim:

public class GridTeste extends CriaGrid{   
    private TelaTeste tipoTelas = new TelaTeste();   
    CriaGrid cg = new CriaGrid();
    cg.loadDynamicList(tipoTelas);
}

Só não vejo sentido neste código, mas fiz para lhe demonstrar como exemplo.
Estude um pouco mais sobre herança e modificadores de acesso.

Abraços champ!

J

O que na verdade eu estou tentando fazer que sao apenas testes para ver como se comporta é passar para uma classe que é a minha menagedbean esse parametro alterado e depois extender ela, e so chamar no meu xhtml a classe extendida com novo valor para o parametro, já que os metodos que eu invoco com esse parametro, por exemplo

tipoTelas.Colunas;
tipoTelas.Titulos;

vao sempre se chamar assim, so vai mudar nome da classe em que eles vao estar sendo instanciados.

tu citou que nao ve mto sentido nesse codigo, (nao sei se eu nao expliquei claramente o que estou tentando testar) mas qual seria tua sugestao?

Abraços!

nel

Se possível, tenta explicar de outra forma? Não ficou muito claro na minha visão isso.
Mas enfim, se você modifica um objeto e depois queres ter acesso a este objeto não precisa necessariamente extender uma classe.

Você até pode extender e depois aplicar o uso dela. Algo assim:

public class GridTeste extends CriaGrid{     
    private TelaTeste tipoTelas = new TelaTeste();     
    //Como é filha, tens acesso direto a ela.
   loadDynamicList(tipoTelas);   
}

Se consideramos tempo de execução e que no seu método load…você manipula/atribui valores a este objeto, logo após o método se você efetuar algo como tipoTelas.getCampo() ele vai lhe retornar algo, sem que você precise necessariamente pegar o valor de retorno do método. Se os teus valores serão sempre fixos, podes utilizar de método/variavél estática, fica mais fácil ainda.
Mas neste caso não use extends.

O maior dilema é, o que afinal, você quer realizar dentro do método loadDynamicList ?
Abraços.

J

entao, o meu maior problema é o seguite, ai nessa classe, CriaGrid, eu cria uma grid dinamica, gera as colunas e campos tudo perfeitinho
o meu problema é o seguinte:

eu vou chamar isso atravez de um xhtml, ou seja, nao existe como passar parametros ou nada disso, estou fazendo algo em JSF.

passo assim agora:

h:panelGrid border="1" binding="#{criaGrid.dynamicDataTableGroup}" />

que chama o meu MenagedBean CriaGrid

que está com o seu parametro no caso, tipoTelas voltando a uma tabela do meu banco de dados, que tem suas configuraçoes, campos, nomes, tamanhos e tudo mais nessa classe.

quando eu chamar o meu outro xhtml, eu vou precisar chamar com outra tabela do meu banco de dados, por isso que eu queria extender

seria mais ou menos isso:

package Telas;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.el.ValueExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlColumn;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;

import Base.Conexao;

@ManagedBean
@SessionScoped
public class CriaGrid {
	//private TelaLinha tipoTelas;
	// Init
	// --------------------------------------------------------------------------------------

	private static List<List<String>> dynamicList; // Simulate fake DB.
	private static String[] dynamicHeaders; // Optional.
	private HtmlPanelGroup dynamicDataTableGroup; // Placeholder.

	// Actions
	// -----------------------------------------------------------------------------------

	private void loadDynamicList() throws SQLException {
		TelaLinha tipoTelas =  new TelaLinha();
		Conexao consulta = new Conexao();
		consulta.Conecta();
		//tipoTelas = new TelaLinha();
		System.out.println(tipoTelas.Coluna().size());
		// Set headers (optional).
		String[] colunas = null;
		colunas = tipoTelas.Titulo();
		dynamicHeaders = colunas;

		// Set rows. This is a stub example, just do your dynamic thing.
		ArrayList<String> registros = null;
		registros = tipoTelas.Coluna();

		ResultSet rsGrid = consulta.Consulta(tipoTelas.Sql());
		dynamicList = new ArrayList<List<String>>();
		System.out.println(tipoTelas.Coluna().size());
		while (rsGrid.next()) {
			ArrayList<String> campos = new ArrayList<String>();
			for (int i = 0; i < tipoTelas.Coluna().size(); i++) {
				campos.add(rsGrid.getString(registros.get(i)));
			}
			campos.add("alterar");
			campos.add("excluir");
			dynamicList.add(campos);
		}
	}

	private void populateDynamicDataTable() {
		// Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">.
		HtmlDataTable dynamicDataTable = new HtmlDataTable();

		ValueExpression ve = FacesContext
				.getCurrentInstance()
				.getApplication()
				.getExpressionFactory()
				.createValueExpression(
						FacesContext.getCurrentInstance().getELContext(),
						"#{criaGrid.dynamicList}", List.class);

		dynamicDataTable.setValueExpression("value", ve);
		dynamicDataTable.setVar("dynamicItem");

		// Iterate over columns.
		for (int i = 0; i < dynamicList.get(0).size(); i++) {

			// Create <h:column>.
			HtmlColumn column = new HtmlColumn();
			dynamicDataTable.getChildren().add(column);

			// Create <h:outputText value="dynamicHeaders[i]"> for <f:facet
			// name="header"> of column.
			HtmlOutputText header = new HtmlOutputText();
			header.setValue(dynamicHeaders[i]);
			column.setHeader(header);

			// Create <h:outputText value="#{dynamicItem[" + i + "]}"> for the
			// body of column.
			HtmlOutputText output = new HtmlOutputText();
			ValueExpression ve2 = FacesContext
					.getCurrentInstance()
					.getApplication()
					.getExpressionFactory()
					.createValueExpression(
							FacesContext.getCurrentInstance().getELContext(),
							"#{dynamicItem[" + i + "]}", String.class);

			output.setValueExpression("value", ve2);
			column.getChildren().add(output);
		}

		// Add the datatable to <h:panelGroup
		// binding="#{myBean.dynamicDataTableGroup}">.
		dynamicDataTableGroup = new HtmlPanelGroup();
		dynamicDataTableGroup.getChildren().add(dynamicDataTable);
	}

	// Getters
	// -----------------------------------------------------------------------------------

	public HtmlPanelGroup getDynamicDataTableGroup() throws SQLException {
		// This will be called once in the first RESTORE VIEW phase.
		if (dynamicDataTableGroup == null) {
			loadDynamicList(); // Preload dynamic list.
			populateDynamicDataTable(); // Populate editable datatable.
		}
		return dynamicDataTableGroup;
	}

	public List<List<String>> getDynamicList() {
		return dynamicList;
	}

	// Setters
	// -----------------------------------------------------------------------------------
	public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
		this.dynamicDataTableGroup = dynamicDataTableGroup;
	}
}

essa classe que coloquei acima, é a classe onde recebe por exemplo os dados da TELALINHA, por padrao por exemplo, mas na hora de chamar no meu xhtml, eu teria que alterar isso, e passar outra classe, TELAFORNECEDORES, TELACLIENTES, que nada mais sao minhas tabelas do banco de dados, que possuem informaçoes como nome dos campos formatados “Descrição” e por ai vai…

nao sei se consegui me fazer mais claro agora.

obrigado
abraço!

nel

Estou no trabalho e teria que avaliar com calma esta sua necessidade.
Só digo assim, não use uma conexão dentro do seu managed bean, esta camada não tem esta responsabilidade, crie outras classes, como “delegates” para simplesmente efetuar chamada as suas regras de negócios, esta camada do bean, não deve ter responsabilidade deste tipo ok? Não é uma boa prática.

Pensa com calma ai que se eu puder analiso tudo isso ok? :slight_smile:
Abraços.

J

Então cara, quanto a classe de conexao, como falei, sao somente testes, nao estou criando nada final já, so estava tentando criar uma tabela dinamica e uma tela dinamica, que tras os campos do meu banco de dados, que isso eu consegui.

Mas blza, vou dar uma olhada e pensar como refazer essa parte da classe padrao. Se tiveres dicas, opinioes…sempre bem vindas!

Abraços!

nel

Deixa eu ver se entendi agora.
Você quer atribuir a uma única “variavél” no seu xhtml vários tipos de objetos, tipolinhas e por ai á fora, já que para cada necessidade, seria criada um determinado tipo de Datagrid, é isso mesmo!? :roll:

Criado 31 de agosto de 2010
Ultima resposta 1 de set. de 2010
Respostas 11
Participantes 4