Tópico anterior Próximo tópico Novo tópico
VB.NET
#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 ![]() |
Ú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 Oráculo! The end is nigh, be ready for the nukes! |
|||
#496607 - 31/03/2021 12:01:27 | ||||
![]() CLEVERTON SERRINHA Cadast. em:Dezembro/2003 ![]() |
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 espírito são imateriais, como eles fazem para se localizar quando o corpo está em movimento? |
|||
Tópico anterior Próximo tópico Novo tópico