Escrito em June 3rd, 2009 as 4:24 pm por

5 Comentários

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.

Se você gostou do post, deixe um comentário ou assine nosso RSS RSS.

Posts Relacionados:

  1. .Net Framework Inside : Comparações Avançadas em .NET (IEquatable)
  2. System.IDisposable e using()
, , , ,

5 Respostas to “Desmistificando Interfaces”


  1. Jeferson

    2 years ago

    Excelente !


  2. Guilherme Bacellar

    2 years 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


  3. Fabio Silveira

    2 years ago

    Perfeito a sua explicação usando os exemplos acimas.
    Obrigado


  4. Lourenco

    1 year ago

    Muito bom e bem explicado os benefícios.
    Parabéns!


  5. eXtevao

    1 year ago

    Parabéns pelo artigo, muito bom!!

Deixa uma Resposta

znjdb32s6g