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

INTERFACE E COMPOSIÇÃO

Boa tarde!

Se eu entendi direito, usando composição e interface posso ter os mesmos recursos que uma superclasse. Tentei refazer o código do bytebank transformando a superclasse Conta em uma interface. Nem cheguei a executar o programa porque não sei como resolver a questão do construtor da conta. Se fosse um construtor simples tipo Conta (agencia, numero) repetiria nas Classes ContaCorrente e ContaPoupanca. Mas e seu tiver um código complexo pra tratar este construtor ? Teria que repetir o código o que imagino não seja uma boa prática. Não sei se fui claro. Quem puder me ajudar segue o link com o projeto

https://github.com/Mauricio-Silveira/ALURA-curso-Java

5 respostas

Olá Maurício, tudo bem com você?

Para ter os mesmos recursos que uma superclasse, usamos herança. Portanto, não precisamos necessariamente ficar presos apenas ao exemplo da interface. E no caso da composição, não há uma relação de herança, já que a classe que está "compondo" a outra não, necessariamente, é subclasse da classe "composta"; uma Conta que possui a classe Cliente como atributo, não tem qualquer relação de herança com ela, porém podemos dizer que uma Conta TEM UM Cliente.

Nesse caso, a superclasse Conta precisa ser uma classe abstrata e não uma interface, já que classes abstratas possuem estado (atributos) e, portanto, possuem métodos e construtores capazes de modificar esse estado. Diferente da interface que serve apenas para determinar O QUE uma classe que a implementa deve fazer sem qualquer implementação ou estado, e sem esses dois não existe construtor para inicializar qualquer atributo.

Resumindo: precisamos de estado (atributos) para que a existência do construtor faça sentido. Porém, interfaces não tem estado e, portanto, não tem construtores. Se insistir em usar uma interface para definir o comportamento (métodos) das subclasses ContaCorrente e ContaPoupanca, terá que definir os construtores dentro de cada uma das classes.

Espero que isso ajude. Se ficou qualquer dúvida é só avisar!

Abraços e bons estudos!!

Obrigado Thiago.

Mas ainda estou meio confuso. no no final do video 1 da aula 7 o instrutor menciona que o autor disse que se tivesse mais tempo teria deixado apenas Interface e Composição.

O instrutor também fala que os desenvolvedores tem preferido muito mais a Interface e Composição para desenvolver seus projetos do que Herança.

Então pensando no que disse o autor, ainda fica a dúvida : se eu tiver várias classes, com construtores complexos (leia-se código de tratamento extenso), como eu faço para criá-los, nesse contexto usando apenas Interface e Composição ? Teria que realmente repetir o código em cada Classe ?

Opa Maurício, tranquilo?

Acredito que nesse caso você não tenha outra saída, como não podemos chamar o construtor da classe mãe nesse caso, precisamos declará-los individualmente na ContaCorrente e ContaPoupanca.

Eu lembro que quando assisti essa aula do Nico pela primeira vez, eu fui pesquisar sobre a intervista onde ele abordou esse assunto. Você pode encontrar a transcrição dela aqui (em inglês)! A questão é que embora a ideia de deixar tudo mais desacoplado com a interface seja boa, na hora de implementar a ideia, isso pode causar muita complexidade desnecessária, como é o caso que estamos vendo. Como o próprio autor menciona na entrevista, a questão de quando usar herança ou interface com composição é muito ampla e ele mesmo admite usar a herança com mais frequência que todo o resto.

O ponto que acredito que podemos tirar disso é que devemos utilizar interface sempre que fizer sentido para deixar nosso código mais limpo na hora de determinar comportamentos de outras classes. Porém, nesse caso, seu uso vai te obrigar a criar diferentes construtores para cada classe que aceitar implementar a interface Conta. Talvez exista alguma solução que eu não conheça, mas no momento eu não consegui encontrar uma que impeça a repetição de código nos construtores. :(

solução!

Obrigado Thiago

Consegui resolver o problema fazendo os construtores das classes ContaCorrente e ContaPoupanca passar os parâmetros para o construtor da classe Movimentacoes (classe de composição), onde os devidos tratamentos são implementados