Mixin (programmering)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 14. juli 2017; checks kræver 10 redigeringer .

En blanding ( eng.  mix in ) er et element i et programmeringssprog (normalt en klasse eller et modul), der implementerer en eller anden klart defineret adfærd. Bruges til at forfine andre klassers adfærd, ikke beregnet til at skabe selvanvendelige .

I objektorienterede programmeringssprog er det en måde at implementere klasser på, som er forskellig fra de meget anvendte principper, der kom fra Simula -programmeringssproget . Mekanismen implementeres først i Flavours. Fordelen ved mixins er, at ved at øge genbrugbarheden af ​​programkode , undgår denne teknik mange af problemerne med multipel nedarvning . Denne metode pålægger dog sine begrænsninger.

Implementering

I de fleste objektorienterede sprog, begyndende med Simula , er en klasse defineret af attributter , metoder , konstruktører og destruktorer som en enkelt, nært beslægtet enhed. Klassedefinitionen er komplet. Det var dette faktum, der syntes nyttigt for Stroustrup og Ellis, som på dette grundlag ikke implementerede mixins i C++ på sprogniveau (C ++ blev udviklet som en "kompatibel C-udvidelse mod Simula") .

I et mixin-sprog er en klasse defineret med kun de attributter og parametre, der er knyttet til klassen. Metoder er defineret andetsteds, som i Flavors og CLOS , og er generiske funktioner. Sidstnævnte implementeres for forskellige typer gennem skemalægning.

Ud over Flavors og CLOS understøtter mixins følgende sprog:

Eksempel

Brug af urenheder

Et eksempel i Ruby. Klassen implementerer det simple aldersbegreb. Aldersværdien gemmes i den interne variabel " alder ", som er åben for skrivning og læsning. For at kunne sammenligne aldre implementerer klassen en enkelt " <=> "-operator, og alle andre (større end, mindre end, lig med osv.) implementeres ved hjælp af denne metode i " Comparable "-inkluderingsmodulet.

klasse Alder omfatter Sammenlignelig attr_accessor ( :alder ) def <=> ( cmp ) @age <=> cmp . alder slut _

Eksemplet demonstrerer skabelsen af ​​objekter og brugen af ​​"blandede" metoder:

a , b = Alder . ny , Alder . nyt a . alder = 10 b . alder = 11 , hvis a < b sætter "a er mindre end b." ende

Emulering

Mixins kan ses som en ufuldstændig implementering af multipel arv , en bestemt slags det. På sprog, der understøtter multipel nedarvning, kan mixins nemt emuleres. For eksempel i C++ kan følgende mønster bruges til at tilføje en " != "-operator til en klasse, når der er en " == "-operator:

skabelon < typenavn T > struct AddNoEq { virtuel bool - operator == ( const T & cmp ) const = 0 ; bool operator != ( const T & cmp ) const { returnere ! static_cast < const T *> ( dette ) -> operator == ( cmp ); } };

En simpel use case for den komplekse talklasse :

#include <iostream> struct Complex : public AddNoEq < Complex > { Kompleks ( int re , int im ) : re_ ( re ), im_ ( im ) { } virtual bool operator == ( const Complex & cmp ) const { returnere cmp . re_ == dette -> re_ && cmp . im_ == dette -> im_ ; } // ... privat : int re_ , im_ ; }; int main () { Kompleks a ( 1 , 2 ), b ( 2 , 3 ); hvis ( a != b ) std :: cout << "Sådan skal det være" << std :: endl ; returnere 0 ; }

Denne metode bruges i en mere udvidet form i Boost- operatørbiblioteket.

Bemærk

Funktionalitet tæt på urenheder leveres af grænseflader i sprog som Java og C# , med den forskel, at en grænseflade kun angiver adfærd, men ikke giver en implementering (i Java, siden version 1.8, er en delvis implementering tilladt i en grænseflade , C# introducerer konceptet "standardimplementering" fra version 8.0). Mekanismen er muligvis kun nyttig til at repræsentere polymorfi . Andre klasser, der giver en implementering af en grænseflade, er nyttige til at bringe fælles funktionalitet på et enkelt sted.

Ved at bruge udvidelsesmetoder og grænseflader sammen , er det muligt at implementere mixin-funktionalitet i C#.

Se også

Links

  • Mix In  (engelsk)  - en beskrivelse af denne programmeringsmetode.