PARA QUE SERVE UMA INTERFACE ?

 Tópico anterior Próximo tópico Novo tópico

PARA QUE SERVE UMA INTERFACE ?

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#496603 - 31/03/2021 09:31:17

MARCOS

Cadast. em:Dezembro/2003


Bom dia!
Colegas, uso bastante classes em meus projetos.
Mas, admito que nunca usei 'Interfaces'. Estou decidido
a mudar isto.
Mas, embora já saiba o que é uma Interface e como criar uma,
ainda não entendi, sua importância.

É fácil entender o que é uma classe abstrata e sua importância .
Podemos , por exemplo ter na classe abstrata, métodos de uso comum a todo o projeto.
De modo que se uma classe concreta precisar, pode herdar estes métodos sem precisar reescrever o método novamente!

Mas, uma interface não pode implementar nada. ou seja , ela não fornece nada a classe concreta.
Ao contrário, obriga a classe concreta que a for implementar, implementar 'todos' os métodos (Inclusive o que não precisa)

Pesquisando na internet, o melhor que consegui foi um colega que me disse que ela permite que dois objetos diferentes conversem entre si. (Sem citar exemplo)
Mas, ainda não encontrei nenhum exemplo 'prático' de situação em que é melhor usar a interface.

Resumo:

Nas classes abstratas, ganha--se tempo e se evita reescrever código usando seus métodos herdados.
Mas se no caso de Interfaces, na hora de implementar os métodos terei que fazer isto nas classes concretas, que vantagem tem em se usar a Interface?

Precisava, de um exemplo 'prático' em que o uso de Interface é vantajoso.

Agradeço qualquer orientação.






#496605 - 31/03/2021 11:05:25

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe

Última edição em 31/03/2021 11:08:41 por KERPLUNK

Apesar de o comportamento de uma classe virtual poder tecnicamente fazer o mesmo que uma interface, o uso delas não deveria ser negligenciável, principalmente pelas 'habilidades' que elas proporcionam. Vamos à um exemplo:
Digamos que você queira fazer uma classe de Log, onde você grava qualquer movimentação de qualquer objeto concreto do seu projeto.
Nessa classe de log você teria um método, que você passa um objeto qualquer para gravar o log em si. Esse método, deve ser capaz de gravar log para qualquer objeto, logo seu parâmetro deve receber um objeto passível de log apenas e não qualquer objeto.
Você poderia facilmente criar um método com um parâmetro genérico do tipo 'object', mas como sabemos, nem tudo você quer logar, apenas os objetos do seu projeto.
Dessa maneira você pode implementar uma classe 'ILoggable' nas classes em que deseja que possam ser logadas. Ficaria algo assim:

interface ILoggable<T>
{
    void Log(T obj);
}
public class Cliente : ILoggable
{
    public int Codigo { get; set; }
    public string Nome { get; set; }
    public void Log(Cliente obj)
    {
         Logger log = new Logger()
         log.Log(obj);
    }
}
//em outro ponto, talvez até outro projeto
public class Logger
{
    public void Log(ILoggable obj)
    {
         //aqui vai sua lógica para gravar o log, seja num banco ou texto. Mas garantidamente, o objeto vai conter as propriedades de log desejadas pois somente objetos 'ILoggable' podem ser passados por parâmetro
    }
}


Na mesma linha de raciocínio, podemos também dizer que a nossa classe Cliente acima, seja necessariamente uma pessoa física(vamos simplificar para somente pessoa física aqui no exemplo). Nesse caso, algumas propriedades podem ser interfaceadas, como nome e data de nascimento.
Essas propriedades também seriam comuns à 'Contato' por exemplo, então vamos implementar:

interface ILoggable<T>
{
    void Log(T obj);
}
interface IPessoa
{
    string Nome;
    DateTime DataNascimento
}
public class Cliente : ILoggable, IPessoa
{
    public int Codigo { get; set; }
    public string Nome {get; set; }
    public DateTime DataNascimento { get; set; }
    public void Log(Cliente obj)
    {
         Logger log = new Logger()
         log.Log(obj);
    }
}
public class Contato : IPessoa
{
    public int Codigo { get; set; }
    public string Nome { get; set; }
    public DateTime DataNascimento { get; set; }
    public string Telefone { get; set; }
    public string Email { get; set; }
}

//em outro ponto, talvez até outro projeto
public class Logger
{
    public void Log(ILoggable obj)
    {
         //aqui vai sua lógica para gravar o log, seja num banco ou texto. Mas garantidamente, o objeto vai conter as propriedades de log desejadas pois somente objetos 'ILoggable' podem ser passados por parâmetro
    }
}

Observe que a classe Contato, implementa IPessoa, mas não ILoggable, portanto não seria passível para logar.
Todo esse comportamento seria totalmente possível de ser feito com classes abstratas. Porém C# não suporta múltipla herança de classe, mesmo abstratas.
Nesse pequeno exemplo, IPessoa é um início para entendimento do polimorfismo, pois temos duas classes que herdam de uma mesma interface e essas classes seriam passíveis de múltiplas funcionalidades.
Como no caso do Logger, toda classe que herda de IPessoa, poderia ser usada com métodos específicos aplicáveis à uma pessoa, mandar e-mail por exemplo. Nesse caso, você teria uma classe responsável por mandar e-mail, que recebe qualquer objeto que herde de IPessoa.

Esse assunto é bem extenso. Digo extenso, porque não considero como complicado, só bastante abrangente, mas esse é um começo para entendimento da aplicação de interfaces.


_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#496607 - 31/03/2021 12:01:27

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
MARCOS
Citação:
Precisava, de um exemplo 'prático' em que o uso de Interface é vantajoso.


Segue a mesmíssima lógica que o KERPLUNK citou.

Imagine que vc crie um projeto Xamarin.Forms que usa código compartilhado entre Windows, Android, iOS. E você precisa usar um método para CopiarArquivo ou EnviarArquivoViaBluetooh.
No código compartilhado vc vai declarar uma variável usando colocando como tipo a interface, mas, vai passar a instância dela através de cada plataforma.

//Isso no código compartilhado, a instância deve ser passada através da plataforma especifica.
IOperacoesComArquivo myFile;
myFile.CopiarArquivo(....);

Espero ter ajudado.





#496619 - 01/04/2021 01:51:02

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 01/04/2021 02:17:15 por JABA

 Anexos estao visíveis somente para usuários registrados

Digamos que você trabalhe numa empresa onde o seu chefe é um profundo conhecedor de POO. Ele chega até você e te apresenta um sistema já em uso, com mesma modelagem da imagem acima (veja a observação abaixo), o qual precisa tornar possível o registro de veículos que andam tanto na terra como no mar. Ou seja, um veículo anfíbio.  Como você faria isso? Acredito que você criaria uma classe chamada VeículoAnfíbio e faria ela herdar da classe abstrata Veículo. Porém, isso seria um grande erro, pois estaria ferindo o princípio da abstração. De que forma? Quando você fosse listar as instâncias de veículos anfíbios através de um comando de repetição para saber se elas são terrestres e aquáticas ao mesmo tempo, você seria obrigado a criar uma gambiarra, pois as classes que dão conta disso estão abaixo na hierarquia, e você acabou herdando-a de uma acima delas cujo foi Veículo. O principal motivo para a existência de Interfaces é dar a possibilidade de se implementar herança múltipla, e esse recurso cai como uma luva nesse nosso exemplo. Para isso basta você criar as interfaces IVeículo, IVeículoTerrestre, IVeículoAquático e implementa-las nas classes abstratas do diagrama mostrado. Assim, você pode criar uma classe concreta chamada VeículoAnfíbio e implementar tanto a interface IVeículoTerrestre quanto a interface IVeículoAquático nela para fazer com que o projeto não perca sua generalidade e nem fira o principio da abstração.

Obs: não estou conseguindo exibir a imagem do diagrama. Considere 3 classes abstratas onde a principal é Veículo e as outras duas, VeículoTerrestre e VeículoAquático, herdem dela.


_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário