Basklasser för implementering av abstraktioner
Kommentar
Det här innehållet skrivs om med behörighet från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Den utgåvan publicerades 2008, och boken har sedan dess reviderats helt i den tredje utgåvan. En del av informationen på den här sidan kan vara inaktuell.
Strängt taget blir en klass en basklass när en annan klass härleds från den. I det här avsnittet är dock en basklass en klass som främst är utformad för att ge en gemensam abstraktion eller för andra klasser för att återanvända någon standardimplementering genom arv. Basklasser ligger vanligtvis mitt i arvshierarkier, mellan en abstraktion i roten av en hierarki och flera anpassade implementeringar längst ned.
De fungerar som implementeringshjälpare för implementering av abstraktioner. En av ramverkets abstraktioner för ordnade samlingar av objekt är IList<T> till exempel gränssnittet. Implementeringen IList<T> är inte trivial och därför tillhandahåller Ramverket flera basklasser, till exempel Collection<T> och KeyedCollection<TKey,TItem>, som fungerar som hjälp för att implementera anpassade samlingar.
Basklasser är vanligtvis inte lämpade för att fungera som abstraktioner själva, eftersom de tenderar att innehålla för mycket implementering. Basklassen Collection<T>
innehåller till exempel massor av implementering relaterad till det faktum att den implementerar det icke-generiska IList
gränssnittet (för att integrera bättre med icke-generiska samlingar) och det faktum att det är en samling objekt som lagras i minnet i ett av dess fält.
Som tidigare nämnts kan basklasser ge ovärderlig hjälp för användare som behöver implementera abstraktioner, men samtidigt kan de vara ett betydande ansvar. De lägger till yta och ökar djupet i arvshierarkier och komplicerar ramverket konceptuellt. Därför bör basklasser endast användas om de ger ett betydande värde till användarna av ramverket. De bör undvikas om de endast ger ett värde till ramverkets implementerare, i vilket fall delegering till en intern implementering i stället för arv från en basklass bör övervägas starkt.
✔️ ÖVERVÄG att göra basklasser abstrakta även om de inte innehåller några abstrakta medlemmar. Detta kommunicerar tydligt till de användare som klassen är utformad enbart för att ärvas från.
✔️ ÖVERVÄG att placera basklasser i ett separat namnområde från huvudlinjescenariotyperna. Per definition är basklasser avsedda för avancerade utökningsscenarier och är därför inte intressanta för de flesta användare.
❌ UNDVIK att namnge basklasser med suffixet "Base" om klassen är avsedd att användas i offentliga API:er.
Portioner © 2005, 2009 Microsoft Corporation. Med ensamrätt.
Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, publicerad 22 okt 2008 av Addison-Wesley Professional som en del av Microsoft Windows Development Series.