Por que eu devo ler este artigo:A utilização de interfaces é uma das principais alternativas de herança do C# e outras linguagens orientadas a objetos.

Ao longo desse artigo traremos as principais interfaces do namespace System.Collections, bem como a relação delas com algumas estruturas de dados importantes no desenvolvimento de software. Mostraremos a importância da interface ICollection, bem como o funcionamento básico de Generics, além da comparação entre alguns dos elementos relacionados mais importantes que enxergamos no desenvolvimento C#.

O conceito de herança é um dos mais importantes da orientação a objetos. A ideia é que as classes filhas sejam capazes de reaproveitar o código das classes pai. No caso do C#, por exemplo, quando pensamos em herança, pensamos na classe Object, da qual todas as demais herdam, direta ou indiretamente.

Mas na maioria dos casos a herança é um recurso para os desenvolvedores utilizarem e criarem um código mais conciso, de fácil reutilização e manutenção.

Algumas linguagens orientadas a objetos utilizam um conceito conhecido como herança múltipla. Esse conceito aparece, por exemplo, em C++, e consiste em permitir que uma única classe herde de várias (tenha vários “pais”).

Isso pode gerar problemas, especialmente em classes da terceira geração, como mostra a Figura 1. Esse tipo de comportamento impede que a classe de hierarquia mais baixa (ClasseFilha3) saiba de onde estão vindo cada uma das propriedades que utiliza, caso tenham o mesmo nome.

Isso gera uma dose extra de cuidado para que a aplicação possa funcionar corretamente.

Figura 1. Exemplo herança múltipla

O problema da herança múltipla foi resolvido em C# e outras linguagens mais modernas como Java com o acréscimo das interfaces. Esses são elementos

abstratos que precisam ser implementados por alguma classe para funcionarem. Eles podem trazer assinaturas de métodos e propriedades que serão compartilhadas por todas as classes que os implementam. Em outras palavras, eles formam uma base de representação para classes com características semelhantes.

Ao longo desse artigo, veremos como funcionam algumas das interfaces padrão do C# .NET, porque elas existem e o que podem fazer por nós, além da relação que as interfaces têm com algumas estruturas de dados importantes para a aplicação.

Além disso, veremos como é importante a utilização desse tipo de artifício para a criação de um sistema de qualidade.

Conhecendo as principais Interfaces do C#

O C# possui uma série de namespaces que podem ser utilizados diretamente. Um deles é o System.Collections, que traz uma série de interfaces, classes e estruturas de dados de uso comum no desenvolvimento de aplicações.

Essas interfaces são muito úteis, formando uma base de representação para futuras classes que as implementarão. Veremos as principais delas ao longo do artigo em detalhes.

Vamos começar apresentando as interfaces. A principal delas é a ICollection, que define alguns atributos essenciais das coleções não-genéricas (as entenderemos a seguir). Essa interface fornece a base necessária às demais, que formam representações de dados, trazendo diversas opções para os desenvolvedores.

São as características que as definem, e precisamos entender qual delas é mais interessante para nós de acordo com o aplicativo que estamos desenvolvendo. As opções são muitas, como mostra a Tabela 1, que não traz todas as interfaces presentes no namespace System.Colletions, apenas as mais importantes, que entenderemos ao longo desse artigo.

Interface

Descrição

ICollection

Tamanho, Enumeradores e métodos de sincronização para coleções não-genéricas

IDictionary

Coleção não-genérica de par chave/valor

IEnumerable

Enumerador que oferece suporte a iterações simples sobre uma coleção não-genérica

IEnumerator

Oferece suporte a iterações simples sobre uma coleção não-genérica

IList

Coleção simples de objetos não-genéricos

Tabela 1. Principais interfaces do namespace System.Collections

O entendimento das interfaces fica mais fácil quando analisamos as implementações das mesmas. Por exemplo, o namespace fornece a classe ArrayList, que implementa a interface IList através de uma matriz cujo tamanho é aumentado dinamicamente quando necessário.

A partir desse exemplo, podemos concluir que a interface IList é, verdadeiramente, uma representação básica de uma coleção simples de objetos não-genéricos.

Em outras palavras, ela traz uma base a ser seguida, com alguns atributos essenciais para a criação de estruturas de dados do tipo Lista. Outras implementações que podemos destacar são:

· Queue: Implementa ICollection, IEnumerable e ICloneable, esta última não pertencente ao namespace System.Collections (e sim ao System). Representa uma fila de dados, baseado no padrão FIFO (First in, First out): primeiro a entrar, primeiro a sair.

· CollectionBase: Implementa IList, ICollection e IEnumerable. É a classe abstrata básica para criação de coleções de dados fortemente tipadas.

· DictionaryBase: Implementa IDictionary, ICollection, IEnumerable. É a classe abstrata básica para a criação de um dicionário de dados, ou seja, uma estrutura fortemente tipada com pares chave/valor.

Quando analisamos es ...

Quer ler esse conteúdo completo? Tenha acesso completo