Interface Design
Nota
Este conteúdo é reimpresso com permissão da Pearson Education, Inc., a partir 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 revisto 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 suporta herança múltipla (ou seja, as classes 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 são frequentemente usadas para alcançar o efeito de herança múltipla. Por exemplo, IDisposable é uma interface que permite que os tipos suportem a descartabilidade independentemente de qualquer outra hierarquia de herança na qual eles queiram participar.
A outra situação em que a definição de uma interface é apropriada é 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.
✔️ DO defina uma interface se precisar de alguma API comum a ser suportada por um conjunto de tipos que inclua tipos de valor.
✔️ CONSIDERE definir uma interface se você precisar oferecer suporte à sua funcionalidade em tipos que já herdam de algum outro tipo.
❌ EVITE usar interfaces de marcador (interfaces sem membros).
Se você precisar marcar uma classe como tendo uma característica específica (marcador), em geral, use um atributo personalizado em vez de uma interface.
✔️ DO fornece 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 IList<T> interface.
✔️ DO fornece pelo menos uma API que consome cada interface definida (um método que toma a interface como um parâmetro ou uma propriedade digitada como a interface).
Fazer isso ajuda a validar o design da interface. Por exemplo, List<T>.Sort consome a System.Collections.Generic.IComparer<T> interface.
❌ NÃO adicione membros a uma interface que tenha sido enviada anteriormente.
Fazer isso quebraria as implementações da interface. Você deve criar uma nova interface para evitar problemas de controle de versão.
Exceto para as situações descritas nestas diretrizes, você deve, em geral, escolher classes em vez de interfaces na criação de bibliotecas reutilizáveis de código gerenciado.
© Partes 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc., de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da Microsoft Windows Development Series.