Dela via


Gränssnittsdesign

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.

Även om de flesta API:er modelleras bäst med hjälp av klasser och structs finns det fall där gränssnitt är lämpligare eller är det enda alternativet.

CLR stöder inte flera arv (dvs. CLR-klasser kan inte ärva från mer än en basklass), men det tillåter typer att implementera ett eller flera gränssnitt förutom att ärva från en basklass. Därför används gränssnitt ofta för att uppnå effekten av flera arv. Är till exempel IDisposable ett gränssnitt som gör det möjligt för typer att stödja disposability oberoende av alla andra arvshierarkier som de vill delta i.

Den andra situationen där det är lämpligt att definiera ett gränssnitt är att skapa ett gemensamt gränssnitt som kan stödjas av flera typer, inklusive vissa värdetyper. Värdetyper kan inte ärva från andra typer än ValueType, men de kan implementera gränssnitt, så att använda ett gränssnitt är det enda alternativet för att tillhandahålla en gemensam bastyp.

✔️ Definiera ett gränssnitt om du behöver ett gemensamt API som stöds av en uppsättning typer som innehåller värdetyper.

✔️ ÖVERVÄG att definiera ett gränssnitt om du behöver stöd för dess funktioner på typer som redan ärver från någon annan typ.

❌ UNDVIK att använda markörgränssnitt (gränssnitt utan medlemmar).

Om du behöver markera en klass som har en specifik egenskap (markör) använder du i allmänhet ett anpassat attribut i stället för ett gränssnitt.

✔️ ANGE minst en typ som är en implementering av ett gränssnitt.

Om du gör det kan du verifiera gränssnittets design. Till exempel List<T> är en implementering av IList<T> gränssnittet.

✔️ Ange minst ett API som använder varje gränssnitt som du definierar (en metod som använder gränssnittet som en parameter eller en egenskap som anges som gränssnitt).

Detta hjälper till att verifiera gränssnittsdesignen. Till exempel List<T>.Sort använder System.Collections.Generic.IComparer<T> gränssnittet.

❌ Lägg INTE till medlemmar i ett gränssnitt som tidigare har levererats.

Detta skulle bryta implementeringarna av gränssnittet. Du bör skapa ett nytt gränssnitt för att undvika versionsproblem.

Förutom de situationer som beskrivs i dessa riktlinjer bör du i allmänhet välja klasser i stället för gränssnitt för att utforma bibliotek som kan återanvändas av hanterad kod.

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.

Se även