Classes base para implementação de abstrações
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.
Estritamente falando, uma classe torna-se uma classe base quando outra classe é derivada dela. Para os fins 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 meio de 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.
Eles servem como auxiliares de implementação para a implementação de abstrações. Por exemplo, uma das abstrações do Framework para coleções ordenadas de itens é a IList<T> interface. A implementação IList<T> não é trivial e, portanto, o Framework 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 por si só, porque tendem a conter muita implementação. Por exemplo, a Collection<T>
classe base contém muita implementação relacionada ao fato de que implementa a interface não genérica IList
(para se integrar melhor com coleções não genéricas) e ao fato de que é uma coleção de itens armazenados na memória em um de seus campos.
Como discutido anteriormente, as classes base podem fornecer uma ajuda inestimável para os usuários que precisam implementar abstrações, mas, ao mesmo tempo, podem ser uma responsabilidade significativa. Eles adicionam área de superfície e aumentam a profundidade das hierarquias de herança, complicando conceitualmente a estrutura. Por conseguinte, as classes base só devem ser utilizadas se proporcionarem um valor significativo aos utilizadores do quadro. Devem ser evitados se fornecerem valor apenas aos implementadores do quadro, caso em que a delegação a 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 elas não contenham nenhum membro abstrato. Isso comunica claramente aos usuários que a classe foi projetada exclusivamente para ser herdada.
✔️ CONSIDERE colocar classes base em um namespace separado dos tipos de cenário principal. Por definição, as classes base destinam-se a cenários avançados de extensibilidade e, portanto, não são interessantes para a maioria dos usuários.
❌ EVITE nomear classes base com um sufixo "Base" se a classe se destinar ao uso em APIs públicas.
© 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.