Mixin (programmering)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 14 juli 2017; kontroller kräver 10 redigeringar .

En blandning ( eng.  mix in ) är ett element i ett programmeringsspråk (vanligtvis en klass eller modul) som implementerar något tydligt definierat beteende. Används för att förfina beteendet hos andra klasser, inte avsett att skapa självanvändbara .

I objektorienterade programmeringsspråk är det ett sätt att implementera klasser som skiljer sig från de allmänt använda principerna som kom från programmeringsspråket Simula . Mekanismen implementeras först i Flavors. Fördelen med mixins är att genom att öka återanvändbarheten av programkod undviker denna teknik många av problemen med multipelt arv . Denna metod medför dock sina begränsningar.

Implementering

I de flesta objektorienterade språk, som börjar med Simula , definieras en klass av attribut , metoder , konstruktörer och destruktorer som en enda, närbesläktad enhet. Klassdefinitionen är komplett. Det var detta faktum som verkade användbart för Stroustrup och Ellis, som på grundval av detta inte implementerade mixins i C ++ på språknivå (C ++ utvecklades som en "kompatibel C-förlängning mot Simula") .

I ett mixin-språk definieras en klass med endast de attribut och parametrar som är associerade med klassen. Metoder definieras på annat håll, som i Flavors och CLOS , och är generiska funktioner. De senare implementeras för olika typer genom schemaläggning.

Förutom Flavors och CLOS stöder mixins följande språk:

Exempel

Användning av föroreningar

Ett exempel i Ruby. Klassen implementerar det enkla begreppet ålder. Åldersvärdet lagras i den interna variabeln " ålder ", som är öppen för skrivning och läsning. För att kunna jämföra åldrar implementerar klassen en enda " <=> "-operator, och alla andra (större än, mindre än, lika med, etc.) implementeras med denna metod i inkluderingsmodulen " Comarable ".

klass Ålder inkluderar Jämförbar attr_accessor ( :ålder ) def <=> ( cmp ) @age <=> cmp . åldersslutet _ _

Exemplet visar skapandet av objekt och användningen av "blandade" metoder:

a , b = Ålder . ny , ålder . nytt a . ålder = 10 b . ålder = 11 om a < b sätter " a är mindre än b." slutet

Emulering

Mixins kan ses som en ofullständig implementering av multipelt arv , en viss typ av det. På språk som stöder flera arv kan mixins enkelt emuleras. Till exempel, i C++ kan följande mönster användas för att lägga till en " != "-operator till en klass när det finns en " == "-operator:

mall < typnamn T > struct AddNoEq { virtuell booloperator == ( const T & cmp ) const = 0 ; _ bool operator != ( const T & cmp ) const { återvända ! static_cast < const T *> ( this ) -> operator == ( cmp ); } };

Ett enkelt användningsfall för den komplexa talklassen :

#include <iostream> struct Complex : public AddNoEq < Complex > { Komplex ( int re , int im ) : re_ ( re ), im_ ( im ) { } virtuell booloperator == ( const Complex & cmp ) const { _ returnera cmp . re_ == detta -> re_ && cmp . im_ == detta -> im_ ; } // ... privat : int re_ , im_ ; }; int main () { Komplex a ( 1 , 2 ), b ( 2 , 3 ); om ( a != b ) std :: cout << "Så ska det vara" << std :: endl ; returnera 0 ; }

Denna metod används i en mer utökad form i Boost- operatörernas bibliotek.

Notera

Funktionalitet nära föroreningar tillhandahålls av gränssnitt i språk som Java och C# , med skillnaden att ett gränssnitt endast anger beteende, men inte tillhandahåller en implementering (i Java, sedan version 1.8, är en partiell implementering tillåten i ett gränssnitt , C# introducerar konceptet "default implementation" från och med version 8.0). Mekanismen kanske bara är användbar för att representera polymorfism . Andra klasser som tillhandahåller en implementering av ett gränssnitt är användbara för att få gemensam funktionalitet på en enda plats.

Genom att använda förlängningsmetoder och gränssnitt tillsammans är det möjligt att implementera mixin-funktionalitet i C#.

Se även

Länkar

  • Mix In  (engelska)  - en beskrivning av denna programmeringsmetod.