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

Curso Design Partterns - Video Aula 1

Ao verificar a video aula 1, me deparei com com uma dúvida na classe principal com o Método void main. Imposto iss = new ISS(); Imposto icms = new ICMS();

No trecho de código acima, Imposto é uma interface, e a mesma está recebendo uma instância de ISS e ICMS. Como isso é possível? O correto não deveria ser um objeto receber uma interface? Gostaria de entender esse tipo de regra do Java.

4 respostas

A Interface é algo estático, não muda. Tanto que você não pode materializá-la, ou seja, usar o operador new. Você cria um objeto que implementa uma determinada interface. Uma interface pode ser implementada por vários objetos diferentes.

No seu exemplo, um Imposto é uma interface. Mas existem vários tipos de impostos diferentes como ISS, ICMS, IPVA, IPTU, entre outros. Todos eles possuem algo em comum: uma taxa. Usamos esse imposto em cima de um valor inicial e calculamos quanto de imposto teremos de pagar. O a diferença entre eles é o valor da taxa e a forma de calcular o imposto.

Portanto, com a interface, podemos chamar um método calculaImposto que, a partir do objeto instanciado, chamaremos o cálculo correto, como está no seu exemplo acima.

Ficou mais claro?

Esse entendimento eu conheço, mas a dúvida é em cima do codigo mesmo no exemplo nao existe O ISS iss = new ISS() antes do objeto receber a interface.

solução!

O Objeto de fato é instanciado quando você executa o comando "new" , se sua classe implementa a interface Imposto , logo ela tem que implementar todos os metodos de imposto tornando ela um imposto e fazendo com que a seguinte declaração seja possível.

Imposto imp = new ICMS();

Como disse a declaracao de imposto à esquerda é apenas a referencia e não o objeto real. Eu apenas estou dizendo ao compilador que vou criar um Imposto de nome imp. Sendo ICMS um imposto essa declaração é valida.

Isso serve para todos os relacionamentos "É UM"(implements/extends)

E em orientação a objetos sempre é recomendado trabalhar com interfaces, pois você poderá reutilizar a referência mais adiante no seu código para instanciar outro objeto de uma classe que também implemente a mesma interface