Setar implementação de uma interface

4 respostas
mcbarsotti

olá a todos,

tem como fazer uma implementação de uma interface de acordo com a classe concreta passada???

tipo assim:

RelatorioFactory relatorioFactory = null;
Relatorio relatorio = relatorioFactory.getRelatorioDeAtividades();
bytes = relatorio.geraRelatorioPdf(relatorioVO);

A RelatorioFactory é uma classe abstrata e tem métodos que retornam classes concretas que implementam a interface Relatorio.

tem como fazer isso??

Vou colar o código aqui:

public abstract class RelatorioFactory {

	public abstract GeraRelatorioDeAtividades getRelatorioDeAtividades();
	
}
public interface Relatorio {

	public byte[] geraRelatorioPdf(Object obj) throws FunctionalityException;
	
	public byte[] geraRelatorioXls(Object obj) throws FunctionalityException;
	
}
public class GeraRelatorioDeAtividades implements Relatorio{

	private static final Log s_log = LogFactory.getLog(GeraRelatorioDeAtividades.class);
	
	public byte[] geraRelatorioPdf(Object obj) throws FunctionalityException {
		return null;
	}

	public byte[] geraRelatorioXls(Object obj) throws FunctionalityException {
		return null;
	}

e a chamada ficaria assim:

RelatorioFactory relatorioFactory = null;
Relatorio relatorio = relatorioFactory.getRelatorioDeAtividades();
bytes = relatorio.geraRelatorioPdf(relatorioVO);

Obrigado!

4 Respostas

mcbarsotti

o problema está na chamada, já que eu preciso passar uma classe concreta que implementa a interface, como eu consigo fazer isso???

Obrigado.

Aldrin_Leal

Você pode imaginar criar uma classe abstrata, mas com um método Factory estático. Não é difícil:

public abstract class RelatorioFactory {
  /**
   * Método que todos os RelatorioFactory precisam definir, por exemplo
   */
  protected abstract void criarRelatorio();

  /**
   * Obtém um relatório.
   **/
  public static RelatorioFactory getRelatorio(String idRelatorio) {
    
  }
}

Um exemplo prático de utilização deste idioma é o commons-logging. Mas imagino que você está fazendo coisas estáticas, o que deve simplificar bastante o trabalho.

mcbarsotti

a idéia é de ter uma interface geral, e setar a sua implementação na hora da escolha do relatorio…

tipo

Interface inter = factory.getImplementacaoInterface();

como eu conseguiria fazer isso?

obrigado

sergiotaborda

mcbarsotti:
olá a todos,

tem como fazer uma implementação de uma interface de acordo com a classe concreta passada???

tipo assim:

RelatorioFactory relatorioFactory = null;
Relatorio relatorio = relatorioFactory.getRelatorioDeAtividades();
bytes = relatorio.geraRelatorioPdf(relatorioVO);

Não ficou claro para mim se o seu problema é obter uma implementação da classe abstrata RelatorioFactory ou se é obter uma classe que implementa Relatorio.

Para o primeiro caso vc usa um padrão chamado de Abstract Factory
Que é basicamente o que o Aldrin Leal já falou. Um método estático na prorpria class RelatorioFactory de forma que o codigo de chamada ficaria

RelatorioFactory relatorioFactory = RelatorioFactory.getFactory();
Relatorio relatorio = relatorioFactory.getRelatorioDeAtividades();
bytes = relatorio.geraRelatorioPdf(relatorioVO);

É aconselhado que .getFactory() não tenha parametros (já isso é violaçao do principio de separação de responsabilidade), mas isso fica a seu critério.

Se o problema é retorna uma classe que implemente Relatorio, vc já a tem. A sua GeraRelatorioDeAtividades (que se deveria chamar RelatorioDeAtividades ) já é a classe que precisa.

O mecanismo que vc está construindo permite que exista a substituição da
classe real que implemente os metodos de RelatorioFactory de forma que exista uma familia de classes que implementem Relatorio.

Ficariam mais ou menos assim

public abstract class RelatorioFactory {


   public static RelatorioFactory getFactory() {
        // escolhe entre uma das fabricas
        // existem varias estratégias para a escolha. 
       // Aqui eu escolhe explicitamente
      return new RelatorioFactoryTipoB();
   }

 
   protected abstract Relatorio getRelatorioDeAtividades();
 
 }

 // uma fabrica possivel
 public class RelatorioFactoryTipoA extends RelatorioFactory  {

 
   protected Relatorio getRelatorioDeAtividades(){
         return new RelatorioDeAtividadesTipoA();
   }
 
 }

// outra fabrica possivel
 public class RelatorioFactoryTipoB extends RelatorioFactory  {

 
   protected Relatorio getRelatorioDeAtividades(){
         return new RelatorioDeAtividadesTipoB();
   }
 
 }
Criado 13 de julho de 2007
Ultima resposta 13 de jul. de 2007
Respostas 4
Participantes 3