Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Uso de Interfaces e o acesso a atributos

Eu estou tentando melhorar o relacionamento entre as minhas classes mas não estou tendo muito sucesso. Vou exemplificar nesse exemplo. Digamos que eu tenha essa interface:

public interface InterfaceMensagem {

    public void enviarText();

}

A classe SmsServico implementa a interface.

public class SmsServico implements InterfaceMensagem{
    String data;
    String nome;
    @Override
    public void enviarText() { 
        //implementação
        System.out.print("enviando texto pelo sms");
    }  
}

Agora, eu fiz a associação entre as classes passando a interface como parâmetro do construtor mas não consigo acessar os atributos data e nome da classe SmsServico. existe alguma maneira de conseguir esse acoplamento baixo utilizando interfaces em contextos semelhantes a esse e ainda conseguir acessar os atributos?


public class Aplicacao {

    public Aplicacao(InterfaceMensagem msm){

    msm.enviarText();

     // não consegue acessar os atributos da classe SmsServico:
    msm.data;
    msm.nome;

    }

}
3 respostas

Olá RPH, o que você poderia criar é uma classe intermediária que implementa a interface e é herdada por outras classes.

Por exemplo:

Interface

public interface InterfaceMensagem {

    public void enviarText(String texto);

}

Implementação

public class ImplMensagem implements InterfaceMensagem{
    String data;
    String nome;
    @Override
    public void enviarText(String texto) { 
        System.out.print(texto);
    }  
}

Classe SMS

public class SmsServico extends ImplMensagem{
    @Override
    public void enviarText() { 
        System.out.print("enviando texto pelo sms");
    }  
}

Classe Bluetooth

public class BluetoothServico extends ImplMensagem{
    @Override
    public void enviarText() { 
        System.out.print("enviando texto pelo bluetooth");
    }  
}

Seria mais ou menos isso que você busca?

Funciona. Mas a ideia inicial é deixar com baixo acoplamento. Nao posso usar herança

solução!

Não é possível acessar o atributo pois não existe esse atributo na sua Interface.

Quando você faz isso:

public Aplicacao(InterfaceMensagem msm)

O compilador não sabe da existência da classe concreta (que implementa a interface).

Por isso acredito que a herança será necessária nesse caso já que você quer acessar os atributos.

Seguindo a implementação que passei acima ficaria algo como:

public Aplicacao(ImplMensagem msm)

E assim você poderia fazer isso:

ImplMensagem msm = new SmsServico();
Aplicacao app = new Aplicacao(msm);

Sendo possível acessar:

msm.data;
msm.nome;

Pois foram atributos herdados da classe que implementa a interface.

Essa forma é bastante usada no mercado, acho que seria o melhor caminho.