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

Referência a uma interface ao invés da classe concreta.

No curso, existe um exercício sobre injeção de dependência com a classe Calendario() e Interface ICalendario(). Por que devemos fazer referência à Interface para injeção de dependência e não a classe concreta?

3 respostas
solução!

Olá, Eduardo

Primeiro, porque essa é uma exigência do enunciado:

Você deseja que uma instância da classe Calendario esteja disponível para uso em todos os pontos da sua aplicação, e deseja que o código não referencie a classe diretamente, mas sim através da sua interface ICalendario.

E segundo, é uma boa prática programar para interfaces, pois isso diminui o acoplamento entre as classes, e não tornamos dependentes delas. Por exemplo, imagine esta classe:

public class MinhaClasse()
{
    public MinhaClasse(Calendario calendario)
    {
    }
}

O que acontece quando você precisa trocar Calendario por uma outra classe SuperCalendario, que implementa os mesmos métodos e interfaces? Nesse caso, você precisa mudar a classe MinhaClasse:

public class MinhaClasse()
{
    public MinhaClasse(SuperCalendario calendario)
    {
    }
}

Isso não é bom, pois a classe não está sendo projetada usando o princípio "OPEN-CLOSED", isto é, aberto para extensibilidade, fechado para modificação. De acordo com esse princípio, você deveria projetar sua classe para que as mudanças, como alterações nos tipos de parâmeros, não necessitem alterações na classe MinhaClasse.

Mas quando você estabelece que a interface utilizada é de uma determinada interface, você já definiu um contrato entre a classe MinhaClasse e o tipo de classe que ela recebe como parâmetro do construtor:

public class MinhaClasse()
{
    public MinhaClasse(ICalendario calendario)
    {
    }
}

A partir daí, não importa qual é exatamente a classe recebida como parâmetro do construtor de MinhaClasse, desde que ela implemente a interface ICalendario.

Agora entendi. Que o enunciado pedia eu sei, mas precisava de um exemplo para entender o motivo, e você me deu um ótimo motivo.

Muito obrigado, Marcelo!

Excelente! Eu que agradeço, Eduardo!

Obrigado por participar do fórum e boas aulas!