Admixture ( eng. mix in ) on ohjelmointikielen elementti (yleensä luokka tai moduuli), joka toteuttaa jonkin selkeästi määritellyn käyttäytymisen. Käytetään parantamaan muiden luokkien käyttäytymistä, ei ole tarkoitettu itsekäytettäviksi .
Olio - ohjelmointikielissä se on tapa toteuttaa luokkia, joka eroaa Simula -ohjelmointikielestä tulleista laajalti käytetyistä periaatteista . Mekanismi toteutetaan ensin Flavorsissa. Mixinien etuna on, että lisäämällä ohjelmakoodin uudelleenkäytettävyyttä tällä tekniikalla vältetään monet moniperinnön ongelmat . Tämä menetelmä asettaa kuitenkin rajoituksensa.
Useimmissa oliokielissä Simulasta alkaen luokka määritellään attribuuttien , menetelmien , konstruktorien ja destruktoreiden avulla yhdeksi, läheisesti liittyväksi kokonaisuudeksi. Luokan määritelmä on valmis. Juuri tämä tosiasia vaikutti hyödylliseltä Stroustrupille ja Ellisille, jotka tällä perusteella eivät toteuttaneet mixinejä C ++:ssa kielitasolla (C ++ kehitettiin "yhteensopivaksi C-laajennukseksi kohti Simulaa") .
Mixin-kielessä luokka määritellään vain luokkaan liittyvillä määritteillä ja parametreilla. Menetelmät on määritelty muualla, kuten Flavours- ja CLOS -kohdissa , ja ne ovat yleisiä toimintoja. Jälkimmäiset toteutetaan eri tyypeille aikataulutuksen kautta.
Flavorsin ja CLOSin lisäksi mixinit tukevat seuraavia kieliä:
Esimerkki Rubyssa. Luokassa toteutetaan yksinkertaista iän käsitettä. Ikäarvo on tallennettu sisäiseen muuttujaan " age ", joka on avoin kirjoittamista ja lukemista varten. Ikävertailua varten luokka toteuttaa yhden " <=> " -operaattorin ja kaikki muut (suurempi kuin, pienempi kuin, yhtä suuri jne.) toteutetaan tällä menetelmällä " Vertaileva " -sisällysmoduulissa.
luokka Ikä sisältää Vertailukelpoinen attr_accessor ( :age ) def <=> ( cmp ) @ikä <=> cmp . ikä loppu _Esimerkki havainnollistaa objektien luomista ja "sekoitettujen" menetelmien käyttöä:
a , b = Ikä . uusi , ikä . uusi a . ikä = 10 b . ikä = 11 , jos a < b sitten asettaa "a on pienempi kuin b." loppuMixiinejä voidaan pitää moniperinnön epätäydellisenä toteutuksena , sen tietynlaisena. Useita perintöä tukevilla kielillä mixinejä voidaan emuloida helposti. Esimerkiksi C++ :ssa seuraavaa kaavaa voidaan käyttää lisäämään " != " -operaattori luokkaan, kun operaattori on " == ":
malli < tyypin nimi T > struct AddNoEq { virtuaalinen bool - operaattori == ( const T & cmp ) const = 0 ; bool- operaattori != ( const T & cmp ) const { takaisin ! static_cast < const T *> ( this ) -> operaattori == ( cmp ); } };Yksinkertainen käyttötapaus kompleksilukuluokalle :
#include <iostream> struct Complex : public AddNoEq < Complex > { Monimutkainen ( int re , int im ) : re_ ( re ), im_ ( im ) { } virtuaalinen bool- operaattori == ( const Complex & cmp ) const { paluu cmp . re_ == tämä -> re_ && cmp . im_ == tämä -> im_ ; } // ... yksityinen : int re_ , im_ ; }; int main () { Kompleksi a ( 1 , 2 ), b ( 2 , 3 ); jos ( a != b ) std :: cout << "Näin sen pitäisi olla" << std :: endl ; paluu 0 ; }Tätä menetelmää käytetään laajennetussa muodossa Boost - operaattorikirjastossa.
Epäpuhtauksia lähellä olevaa toimivuutta tarjoavat käyttöliittymät kielillä, kuten Java ja C# , sillä erolla, että rajapinta vain määrittelee käyttäytymisen, mutta ei tarjoa toteutusta (Javassa versiosta 1.8 lähtien osittainen toteutus on sallittu käyttöliittymässä , C# esittelee "oletustoteutuksen" käsitteen versiosta 8.0 alkaen). Mekanismi voi olla hyödyllinen vain polymorfismin esittämiseen . Muut luokat, jotka tarjoavat käyttöliittymän toteutuksen, ovat hyödyllisiä yhteisten toimintojen tuomiseksi yhteen paikkaan.
Laajennusmenetelmiä ja rajapintoja yhdessä käyttämällä on mahdollista toteuttaa mixin-toiminnallisuus C#:ssa.