Diferença entre IClasse e Classe
Olá,
Com base nos artigos seguintes:
1) http://www.codigofonte.net/dicas/dotnet/271_usando-interfaces-no-net
2) https://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=13337
3) http://msdn.microsoft.com/pt-br/library/87d83y5b.aspx
Pude compreender qual o papel de uma Interface, porém não consegui captar o diferencial entre usá-las ou não. Os artigos 1 e 2 por exemplo, deixam claro as vantagens de uma classe herdar uma interface, a qual atua então como um "contrato" da mesma, obrigado-a implementar o que está na interface herdada.
O que eu não consigo entender, pois ainda estou pouco tão familiarizado com POO, é por que instanciar uma interface ao invés da classe diretamente, exemplo:
IDictionary<int, string> MyIDictionay = new Dictionary<int, string>();
Dictionary<int, string> MyDictionary = new Dictionary<int, string>(); O que muda ? Obrigado.
Dictionary<int, string> MyDictionary = new Dictionary<int, string>(); O que muda ? Obrigado.
Rubens Cury
Curtidas 0
Respostas
Fabio Mans
08/01/2010
Rubens o conceito de Interface você entendeu certo?
Eu sempre lembro de um conceito que um professor passou.
Imagine que você está modelando um sistema e um programador irá codifica-lo, obrigatoriamente você precisa que uma determinada classe tenha um método que faça uma inclusão e outro que retorne uma lista, para isso você cria uma interface com este dois métodos e o programador deve herdar esta interface, assim ele será obrigado a implementar os dois métodos, ou seja é um contrato, você garante que os métodos serão criados.
Agora sua dúvida.
O objetivo é sua API seja mais genérica possível, por exemplo
IDataReader reader = db.ExecuteReader("SELECT CENTRO, NOME FROM Centro WHERE CENTRO IS NOT NULL AND NOME IS NOT NULL ORDER BY 2"
IDataReader reader = sqlcmd.ExecuteReader
IDataReader reader = oraclecmd.ExecuteReader
IDataReader reader = oledbcmd.ExecuteReader Eu posso executar um command no sql, um oracle ou oledb Outra exemplo bastante utilizado é o IList<T> e o List<T> Ilist é uma interface, logo qualquer controle que implemente IList pode ser usado quando você aplica este conceito, ou seja, esta abstraindo a implementação , assim o codigo fica + genérico Resumindo: utilizar o mínimo para torná-lo mais usável. Caso se interesse mais sobre o assunto recomendo ler este ebook http://oreilly.com/catalog/pnetcomp2/chapter/ch03.pdf E procure na revista .NET Magazine edição 68 o artigo Injeção de Dependência. (Como manter baixo o nível de acoplamento entre diferentes partes de uma aplicação) Espero ter ajudado. Fabio
IDataReader reader = oraclecmd.ExecuteReader
IDataReader reader = oledbcmd.ExecuteReader Eu posso executar um command no sql, um oracle ou oledb Outra exemplo bastante utilizado é o IList<T> e o List<T> Ilist é uma interface, logo qualquer controle que implemente IList pode ser usado quando você aplica este conceito, ou seja, esta abstraindo a implementação , assim o codigo fica + genérico Resumindo: utilizar o mínimo para torná-lo mais usável. Caso se interesse mais sobre o assunto recomendo ler este ebook http://oreilly.com/catalog/pnetcomp2/chapter/ch03.pdf E procure na revista .NET Magazine edição 68 o artigo Injeção de Dependência. (Como manter baixo o nível de acoplamento entre diferentes partes de uma aplicação) Espero ter ajudado. Fabio
GOSTEI 0
Rubens Cury
08/01/2010
Oi Fábio,
Dinte das suas explicações entendi então que:
Se uma classe implementar uma determinada interface, é melhor fazer o uso da interface do que da própria classe, o que torna o código mais genérico, abstrato e com maior capacidade de reutilização; uma vez que todos os controles que implementarem a interface utilizada também poderão ser utilizados.
Entendi no exemplo do IDataReader que independente de qual provider você está optando por utilizar (SQL, ORACLE, ETC), o IDataReader se encarregará de realizar tal implementação.
Em relação a analogia entre as interfaces e contratos, eu classificaria simbolicamente as interfaces como "cláusulas contratuais" e as classes que a implementam como os "conteúdos e regras das mesmas".
Outra questão em coloco é em relação a codificação do software. Se o programador no caso não fizer o uso da interface ele conseguirá implementar o código que ele bem desejar (ou não ?). Se for isso, ou seja, se ele for capaz codificar o que ele desejar sem utilizar a interface, obrigá-lo e lembrá-lo de herdar tal interface, não seria o mesmo que obrigá-lo e lembrá-lo a aplicar corretamente uma classe sem a interface ?
Minhas conclusões estão corretas ? Um abraço.
Entendi no exemplo do IDataReader que independente de qual provider você está optando por utilizar (SQL, ORACLE, ETC), o IDataReader se encarregará de realizar tal implementação.
Em relação a analogia entre as interfaces e contratos, eu classificaria simbolicamente as interfaces como "cláusulas contratuais" e as classes que a implementam como os "conteúdos e regras das mesmas".
Outra questão em coloco é em relação a codificação do software. Se o programador no caso não fizer o uso da interface ele conseguirá implementar o código que ele bem desejar (ou não ?). Se for isso, ou seja, se ele for capaz codificar o que ele desejar sem utilizar a interface, obrigá-lo e lembrá-lo de herdar tal interface, não seria o mesmo que obrigá-lo e lembrá-lo a aplicar corretamente uma classe sem a interface ?
Minhas conclusões estão corretas ? Um abraço.
GOSTEI 0
Fabio Mans
08/01/2010
Sobre suas três primeiras questões respondo que é isso mesmo, vejo que entendeu corretamente.
Sobre a quarta questão, sim, caso não implemente a interface ele pode não criar os métodos que você está propondo, e a explicação sobre o programador é só uma idéia para fixar o conceito, não quer dizer que irá acontecer, o programador deve ler a documentação, geralmente um diagrama de classes e implementar o que está sendo solicitado e não fazer o que ele pretende.
Fabio
========================================================
Oi Fábio,
Dinte das suas explicações entendi então que:
Se uma classe implementar uma determinada interface, é melhor fazer o uso da interface do que da própria classe, o que torna o código mais genérico, abstrato e com maior capacidade de reutilização; uma vez que todos os controles que implementarem a interface utilizada também poderão ser utilizados.
Entendi no exemplo do IDataReader que independente de qual provider você está optando por utilizar (SQL, ORACLE, ETC), o IDataReader se encarregará de realizar tal implementação.
Em relação a analogia entre as interfaces e contratos, eu classificaria simbolicamente as interfaces como "cláusulas contratuais" e as classes que a implementam como os "conteúdos e regras das mesmas".
Outra questão em coloco é em relação a codificação do software. Se o programador no caso não fizer o uso da interface ele conseguirá implementar o código que ele bem desejar (ou não ?). Se for isso, ou seja, se ele for capaz codificar o que ele desejar sem utilizar a interface, obrigá-lo e lembrá-lo de herdar tal interface, não seria o mesmo que obrigá-lo e lembrá-lo a aplicar corretamente uma classe sem a interface ?
Minhas conclusões estão corretas ? Um abraço.
Entendi no exemplo do IDataReader que independente de qual provider você está optando por utilizar (SQL, ORACLE, ETC), o IDataReader se encarregará de realizar tal implementação.
Em relação a analogia entre as interfaces e contratos, eu classificaria simbolicamente as interfaces como "cláusulas contratuais" e as classes que a implementam como os "conteúdos e regras das mesmas".
Outra questão em coloco é em relação a codificação do software. Se o programador no caso não fizer o uso da interface ele conseguirá implementar o código que ele bem desejar (ou não ?). Se for isso, ou seja, se ele for capaz codificar o que ele desejar sem utilizar a interface, obrigá-lo e lembrá-lo de herdar tal interface, não seria o mesmo que obrigá-lo e lembrá-lo a aplicar corretamente uma classe sem a interface ?
Minhas conclusões estão corretas ? Um abraço.
GOSTEI 0
Rubens Cury
08/01/2010
Obrigado pela explicação Fábio. Done!
GOSTEI 0