Header Ads

O que uma interface faz na programação orientada a objetos?

Um dos principais componentes das linguagens orientadas a objetos, como Java e C #, é a capacidade de escrever classes usando interfaces, que padronizam as definições de método e permitem polimorfismo aprimorado. Discutiremos o que são e como usá-los.

Polimorfismo formalizado

Interfaces são basicamente classes sem código. Eles podem definir propriedades e métodos (embora não campos diretamente) sem realmente armazenar dados ou escrever uma implementação para funções.

Por exemplo, a interface IEnumerable do . NET é muito comum. Tudo o que ele requer é uma função que retorna um IEnumerator, que pode ser usado para iterar em uma coleção.

publicinterface IEnumerable & # 123; IEnumerator GetEnumerator & # 40; & # 41 ;; & # 125;

Cada coleção em . NET implementa esta interface. Na verdade, a maioria das coleções implementará muitas interfaces, todas padronizando os métodos usados ​​para trabalhar com elas.

A vantagem de fazer dessa maneira é que todos os métodos são padronizados na interface, de modo que sempre que você quiser que algo aceite muitos tipos de classes, você pode fazer isso acessando os métodos de interface.

Por exemplo, os loops foreach ocultos usam apenas . GetEnumerator (), portanto, eles suportarão qualquer tipo de coleção que implemente IEnumerable, como Lists, Dictionaries e HashSets.

void Main & # 40; & # 41; & # 123; foreach & # 40; var item em IEnumerable & # 41; & # 123; // faça algo & # 125; & # 125;

Você pode pensar em Interfaces como sendo um substituto para as classes básicas. As classes básicas ainda são muito úteis, mas exigir que cada classe herde e substitua métodos pode ser complicado. Além disso, você só pode ter uma classe base, mas pode implementar qualquer número de interfaces.

Interfaces também podem ser usadas no lugar de parâmetros de tipo. Por exemplo, você pode ter uma coleção personalizada, CustomList < T & gt ;. Isso funciona para qualquer tipo, mas se você quiser chamar um método específico em cada elemento, não poderá fazê-lo, pois o compilador não tem ideia se o tipo que está sendo usado suporta esse método. As únicas opções que você obterá serão métodos para objetos básicos.

No entanto, se, em vez disso, abandonar o parâmetro de tipo genérico e usar uma interface, você pode chamar um método nos itens. A coleção ainda suportará qualquer tipo de tipo, embora agora cada item que você pretende incluir precise implementar a interface.

Em geral, você deve usar interfaces ao &’ reutilizar os mesmos métodos para muitas classes que não herdam umas das outras e você gostaria de poder escrever código polimórfico que não o &’ &’ não me importo com a classe subjacente específica.

Usando interfaces

As interfaces são muito simples de usar. Eles usam a mesma sintaxe de herança das classes base, dois pontos após a definição da classe. Observe que se você deseja usar uma interface com uma classe base, a classe base deve vir primeiro, seguida por uma vírgula e, em seguida, quaisquer interfaces que ela implementar.

Depois de adicionar a definição da interface, você provavelmente obterá um erro. O Visual Studio informará que você não está realmente implementando as propriedades e métodos da interface. Na verdade, isso pode ser muito útil, pois se você fizer qualquer alteração na interface, precisará atualizar todas as classes que a implementam.

O Visual Studio é muito sofisticado e se você clicar em “ mostrar possíveis correções, ” você terá uma opção para que o VS adicione automaticamente o padrão de interface à sua classe. Obviamente, você precisará substituir NotImplementedExceptions.

Você também pode implementar interfaces explicitamente. Isso tem o mesmo efeito, mas com uma sintaxe diferente que deixa claro de qual interface o método ou propriedade vem. Isso parece muito estranho à primeira vista, mas pode ser útil se você estiver implementando muitas interfaces.

Escrevendo suas próprias interfaces

As definições de interface são praticamente as mesmas que as de classe, embora cada método não tenha um corpo e você &’ você precisará usar a “ interface ” em vez de “ classe, ” obviamente. Assim como as classes, as interfaces também podem usar parâmetros de tipo genérico, que podem ser úteis para coleções personalizadas.

Você pode usar o {get; conjunto; } sintaxe para especificar propriedades implicitamente, o que também funciona ao implementá-las na classe real:

Você também pode fazer com que as interfaces herdem uma da outra. Por exemplo, esta interface ICustomList pode ser muito mais útil se simplesmente incluir todas as outras definições que List usa, mas adiciona algumas definições personalizadas. Agora, quando for usar a interface, você &’ precisará implementar todos os membros da interface de cada interface da qual ela herda.

Nenhum comentário