Classes base para implementar abstrações
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.
Estritamente falando, uma classe se torna uma classe base quando outra classe é derivada dela. Para a finalidade desta seção, no entanto, uma classe base é uma classe projetada principalmente para fornecer uma abstração comum ou para outras classes reutilizarem alguma implementação padrão por herança. As classes base geralmente ficam no meio de hierarquias de herança, entre uma abstração na raiz de uma hierarquia e várias implementações personalizadas na parte inferior.
Elas servem como auxiliares de implementação para implementar abstrações. Por exemplo, uma das abstrações da Framework para coleções ordenadas de itens é a interface IList<T>. A implementação IList<T> não é trivial e, portanto, a Estrutura fornece várias classes base, como Collection<T> e KeyedCollection<TKey,TItem>, que servem como auxiliares para implementar coleções personalizadas.
As classes base geralmente não são adequadas para servir como abstrações sozinhas, pois tendem a conter muita implementação. Por exemplo, a classe base Collection<T>
contém muita implementação relacionada ao fato de implementar a interface não genérica IList
(para integrar melhor com coleções não genéricas) e ao fato de ser uma coleção de itens armazenados na memória em um de seus campos.
Como já discutido, as classes base podem fornecer ajuda inestimável para os usuários que precisam implementar abstrações, mas, ao mesmo tempo, podem ser uma responsabilidade significativa. Elas adicionam área de superfície e aumentam a profundidade das hierarquias de herança, portanto, complicam conceitualmente a estrutura. Assim, as classes base só deverão ser usadas se fornecerem um valor significativo para os usuários da estrutura. Elas devem ser evitadas se fornecerem valor somente aos implementadores da estrutura, nesse caso, a delegação para uma implementação interna, em vez de herança de uma classe base deve ser fortemente considerada.
✔️ CONSIDERE tornar as classes base abstratas mesmo que não contenham membros abstratos. Isso comunica claramente aos usuários que a classe foi projetada somente para ser herdada.
✔️ CONSIDERE colocar classes base em um namespace separado dos tipos de cenário principais. Por definição, as classes base se destinam a cenários avançados de extensibilidade, portanto, não são interessantes para a maioria dos usuários.
❌ EVITE nomear classes base com um sufixo "Base" se a classe for destinada a ser usada em APIs públicas.
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.