Ultimamente algumas pessoas tem me perguntado sobre Interfaces, então, vou falar um pouco sobre esse assunto e também tentar remover um pouco da bruma que cobre esse assunto.
Primeiramente as Interfaces são contratos e como tal definem explicitamente o que seus utilizadores devem prover.
Bom, vamos pensar em uma Interface com o nome (ITipoDePessoa). Ela define que devem existir 2 métodos (CarregarDoBancoDeDados e CalcularImposto) e 1 propriedade (TotalImpostoDevido).
C#
interface ITipoDePessoa
{
void CarregarDoBancoDeDados(int id);
void CalcularImposto();
decimal TotalImpostoDevido { get; }
}
VB.NET
Interface ITipoDePessoa
Sub CarregarDoBancoDeDados(ByVal id As Integer)
Sub CalcularImposto()
ReadOnly Property TotalImpostoDevido() As Decimal
End Interface
Neste ponto devemos observar que os métodos e propriedades que as Interfaces especificam são sempre públicos, uma vez que uma Interface é um contrato que define os métodos públicos.
Com essa Interface podemos implementar N classes distintas, mas que realizam operações com o mesmo objetivo (operações descritas pela interface). Para nosso exemplo vamos implementar uma classe para Pessoa Jurídica e uma para Pessoa Física.
C#
class PessoaFisica : ITipoDePessoa
{
public void CarregarDoBancoDeDados(int id)
{
// Código para Carregar Esse Objeto
}
public void CalcularImposto()
{
// Código para Calcular o Imposto desta Pessoa Física
}
public decimal TotalImpostoDevido
{
get
{
// Retorna a Quantidade de Imposto Devido por esta Pessoa Física
return 0;
}
}
}
class PessoaJuridica : ITipoDePessoa
{
public void CarregarDoBancoDeDados(int id)
{
// Código para Carregar Esse Objeto
}
public void CalcularImposto()
{
// Código para Calcular o Imposto desta Pessoa Jurídica
}
public decimal TotalImpostoDevido
{
get
{
// Retorna a Quantidade de Imposto Devido por esta Pessoa Jurídica
return 0;
}
}
}
VB.NET
Class PessoaFisica
Implements ITipoDePessoa
Public Sub CalcularImposto() Implements ITipoDePessoa.CalcularImposto
' Código para Carregar Esse Objeto
End Sub
Public Sub CarregarDoBancoDeDados(ByVal id As Integer) Implements ITipoDePessoa.CarregarDoBancoDeDados
' Código para Calcular o Imposto desta Pessoa Física
End Sub
Public ReadOnly Property TotalImpostoDevido() As Decimal Implements ITipoDePessoa.TotalImpostoDevido
Get
' Retorna a Quantidade de Imposto Devido por esta Pessoa Física
Return 0
End Get
End Property
End Class
Class PessoaJuridica
Implements ITipoDePessoa
Public Sub CalcularImposto() Implements ITipoDePessoa.CalcularImposto
' Código para Carregar Esse Objeto
End Sub
Public Sub CarregarDoBancoDeDados(ByVal id As Integer) Implements ITipoDePessoa.CarregarDoBancoDeDados
' Código para Calcular o Imposto desta Pessoa Física
End Sub
Public ReadOnly Property TotalImpostoDevido() As Decimal Implements ITipoDePessoa.TotalImpostoDevido
Get
' Retorna a Quantidade de Imposto Devido por esta Pessoa Física
Return 0
End Get
End Property
End Class
Agora você se pergunta para que todo esse trabalho?
Bom, podemos utilizar essas classes de 2 jeitos: Sem Interface e Com Interface.
Sem Interface em C#
PessoaFisica pf = new PessoaFisica(); pf.CarregarDoBancoDeDados(5); pf.CalcularImposto(); decimal impostoDevidoPF = pf.TotalImpostoDevido; PessoaJuridica pj = new PessoaJuridica(); pj.CarregarDoBancoDeDados(5); pj.CalcularImposto(); decimal impostoDevidoPJ = pj.TotalImpostoDevido;
Sem Interface em VB.NET
Dim pf As PessoaFisica = New PessoaFisica() pf.CarregarDoBancoDeDados(5) pf.CalcularImposto() Dim impostoDevidoPF As Decimal = pf.TotalImpostoDevido Dim pj As PessoaJuridica = New PessoaJuridica() pj.CarregarDoBancoDeDados(5) pj.CalcularImposto() Dim impostoDevidoPJ As Decimal = pj.TotalImpostoDevido
Com Interface em C#
ITipoDePessoa pessoa = new PessoaFisica(); pessoa.CarregarDoBancoDeDados(5); pessoa.CalcularImposto(); decimal impostoDevido = pessoa.TotalImpostoDevido;
Com Interface em VB.NET
Dim pessoa As ITipoDePessoa = New PessoaFisica() pessoa.CarregarDoBancoDeDados(5) pessoa.CalcularImposto() Dim impostoDevido As Decimal = pessoa.TotalImpostoDevido
Neste momento você deve estar se perguntando: cadê o benefício?
Para isso, precisamos de um cenário. Que tal um em que temos de calcular o imposto de um cliente (Seja ele pessoal física ou jurídica) em um método.
Sem Interface em C#
private decimal CalculaImpostoPessoa(int id,
string tipoPessoa)
{
if (tipoPessoa == "pf")
{
PessoaFisica pf = new PessoaFisica();
pf.CarregarDoBancoDeDados(id);
pf.CalcularImposto();
return pf.TotalImpostoDevido;
}
else if (tipoPessoa == "pj")
{
PessoaJuridica pj = new PessoaJuridica();
pj.CarregarDoBancoDeDados(id);
pj.CalcularImposto();
return pj.TotalImpostoDevido;
}
return 0;
}
Sem Interface em VB.NET
Private Function CalculaImpostoPessoa(ByVal id As Integer, _
ByVal tipoPessoa As String) As Decimal
If (tipoPessoa = "pf") Then
Dim pf As PessoaFisica = New PessoaFisica()
pf.CarregarDoBancoDeDados(id)
pf.CalcularImposto()
Return pf.TotalImpostoDevido
ElseIf (tipoPessoa = "pj") Then
Dim pj As PessoaJuridica = New PessoaJuridica()
pj.CarregarDoBancoDeDados(id)
pj.CalcularImposto()
Return pj.TotalImpostoDevido
End If
Return 0
End Function
Com Interface em C#
private decimal CalculaImpostoPessoa(int id,
string tipoPessoa)
{
ITipoDePessoa pessoa;
if (tipoPessoa == "pf")
{
pessoa = new PessoaFisica();
}
else if (tipoPessoa == "pj")
{
pessoa = new PessoaFisica();
}
else
{
return 0;
}
pessoa.CarregarDoBancoDeDados(id);
pessoa.CalcularImposto();
return pessoa.TotalImpostoDevido;
}
Com Interface em VB.NET
Private Function CalculaImpostoPessoa(ByVal id As Integer, _
ByVal tipoPessoa As String) As Decimal
Dim pessoa As ITipoDePessoa
If (tipoPessoa = "pf") Then
pessoa = New PessoaFisica()
ElseIf (tipoPessoa = "pj") Then
pessoa = New PessoaFisica()
Else
Return 0
End If
pessoa.CarregarDoBancoDeDados(id)
pessoa.CalcularImposto()
Return pessoa.TotalImpostoDevido
End Function
Agora acredito que os benefícios ficaram claros.
Neste exemplo tempos um mecanismo mais flexivel e de fácil manutenção para o calculo de imposto, pois, como a Interface define os métodos que as classes (idependentemente de quais sejam) devem fornecer e executar, podemos simplesmente instanciar as classes para sua Interface e utilizar a Interface para trabalhar.
Posts Relacionados:



4 Respostas to “Desmistificando Interfaces”
Jeferson
1 year ago
Excelente !
Guilherme Bacellar
1 year ago
Muito Obrigado,
Nós da equipe .Net Max aproveitamos para reforçar o nosso desejo para que nossos visitantes sempre comentem os artigos e deem notas.
Isso é importante para nós da equipe e para os autores.
Mais uma vez, Obrigado
Fabio Silveira
12 months ago
Perfeito a sua explicação usando os exemplos acimas.
Obrigado
Lourenco
3 months ago
Muito bom e bem explicado os benefícios.
Parabéns!