Condividi tramite


Classi base per l'implementazione di astrazioni

Nota

Questo contenuto viene ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idiomsn and Patterns for Reusable .NET Libraries, 2nd Edition. Tale edizione è stata pubblicata nel 2008 e il libro è stato completamente rivisto nella terza edizione. Alcune informazioni in questa pagina potrebbero non essere aggiornate.

In senso stretto, una classe diventa una classe base quando da essa deriva un'altra classe. Ai fini di questa sezione, tuttavia, una classe base è una classe progettata principalmente per fornire un'astrazione comune o per permettere ad altre classi di riutilizzare un'implementazione predefinita tramite l'ereditarietà. Le classi di base si trovano in genere al centro delle gerarchie di ereditarietà, tra un'astrazione alla radice di una gerarchia e diverse implementazioni personalizzate nella parte inferiore.

Fungono da helper di implementazione per le astrazioni. Ad esempio, una delle astrazioni di Framework per raccolte ordinate di elementi è l'interfaccia IList<T>. L'implementazione di IList<T> non è semplice e pertanto .NET Framework fornisce diverse classi di base, ad esempio Collection<T> e KeyedCollection<TKey,TItem>, che fungono da helper per l'implementazione di raccolte personalizzate.

Le classi di base in genere non sono adatte per fungere da astrazioni da sole, perché tendono a contenere troppe implementazioni. Ad esempio, la classe base Collection<T> contiene molte implementazioni correlate all'implementazione dell'interfaccia IList non generica (per integrarsi meglio con raccolte non generiche) e al fatto che si tratti di una raccolta di elementi archiviati in memoria in uno dei relativi campi.

Come illustrato in precedenza, le classi di base possono fornire un aiuto prezioso agli utenti che devono implementare astrazioni, ma allo stesso tempo possono essere una responsabilità significativa. Aggiungono area di superficie e aumentano la profondità delle gerarchie di ereditarietà e quindi complicano concettualmente il framework. Pertanto, le classi di base devono essere usate solo se forniscono valore significativo agli utenti del framework. Devono essere evitate se forniscono valore solo agli implementatori del framework, nel qual caso la delega a un'implementazione interna anziché l'ereditarietà da una classe di base deve essere invece presa in considerazione.

✔️ PRENDERE IN CONSIDERAZIONE la possibilità di rendere astratte le classi di base anche se non contengono membri astratti. Ciò comunica chiaramente agli utenti che la classe è progettata esclusivamente per essere ereditata.

✔️ PRENDERE IN CONSIDERAZIONE l'inserimento di classi di base in uno spazio dei nomi separato dai tipi di scenario mainline. Per definizione, le classi di base sono destinate a scenari di estendibilità avanzati e pertanto non sono di interesse per la maggior parte degli utenti.

❌ EVITARE la denominazione delle classi di base con un suffisso "Base" se la classe è destinata all'uso nelle API pubbliche.

Parti protette da copyright © 2005, 2009 Microsoft Corporation. Tutti i diritti sono riservati.

Ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2a edizione di Krzysztof Cwalina and Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional nella collana Microsoft Windows Development Series.

Vedi anche