Design de interface
Observação
Este conteúdo é reimpresso com permissão da Pearson Education, Inc. de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Essa edição foi publicada em 2008 e, desde então, o livro foi totalmente revisado na terceira edição. Algumas das informações nesta página podem estar desatualizadas.
Embora a maioria das APIs seja melhor modelada usando classes e structs, há casos em que as interfaces são mais apropriadas ou são a única opção.
O CLR não dá suporte a várias heranças (ou seja, as classes de CLR não podem herdar de mais de uma classe base), mas permite que os tipos implementem uma ou mais interfaces, além de herdar de uma classe base. Portanto, as interfaces geralmente são usadas para obter o efeito de várias heranças. Por exemplo, IDisposable é uma interface que permite que os tipos ofereçam suporte à eliminação, independentemente de qualquer outra hierarquia de herança na qual desejam participar.
A outra situação em que a definição de uma interface é apropriada está na criação de uma interface comum que pode ser suportada por vários tipos, incluindo alguns tipos de valor. Os tipos de valor não podem herdar de tipos diferentes de ValueType, mas podem implementar interfaces, portanto, usar uma interface é a única opção para fornecer um tipo base comum.
✔️ DEFINA uma interface se você precisar que alguma API comum tenha suporte de um conjunto de tipos que incluem tipos de valor.
✔️ CONSIDERE definir uma interface se você precisar dar suporte à sua funcionalidade em tipos que já herdam de algum outro tipo.
❌ EVITE o uso de interfaces de marcador (interfaces sem membros).
Se você precisar marcar uma classe como tendo uma característica específica (marcador), no geral, use um atributo personalizado em vez de uma interface.
✔️ FORNEÇA pelo menos um tipo que é uma implementação de uma interface.
Fazer isso ajuda a validar o design da interface. Por exemplo, List<T> é uma implementação da interface IList<T>.
✔️ FORNEÇA pelo menos uma API que consome cada interface que você define (um método que usa a interface como um parâmetro ou uma propriedade tipada como a interface).
Fazer isso ajuda a validar o design da interface. Por exemplo, List<T>.Sort consome a interface System.Collections.Generic.IComparer<T>.
❌ NÃO adicione membros a uma interface que tenha sido enviada anteriormente.
Isso interromperia as implementações da interface. Você deve criar uma nova interface para evitar problemas de controle de versão.
Exceto pelas situações descritas nessas diretrizes, você deve, no geral, escolher classes em vez de interfaces na criação de bibliotecas reutilizáveis de código gerenciado.
Portions © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc. das Diretrizes de Design do Framework: convenções, linguagens e padrões para bibliotecas do .NET reutilizável, 2ª edição por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da série de desenvolvimento do Microsoft Windows.