Az admixture ( eng. mix in ) egy programozási nyelv (általában egy osztály vagy modul) eleme , amely valamilyen világosan meghatározott viselkedést valósít meg. Más osztályok viselkedésének finomítására szolgál, nem arra szolgál, hogy önfelhasználhatóvá váljon .
Az objektum-orientált programozási nyelvekben ez az osztályok megvalósításának egyik módja, amely eltér a Simula programozási nyelvből származó, széles körben használt elvektől . A mechanizmust először a Flavours -ban hajtják végre. A mixins előnye, hogy a programkód újrafelhasználhatóságának növelésével ez a technika elkerüli a többszörös öröklődés problémáit . Ez a módszer azonban megszabja a korlátait.
A legtöbb objektum-orientált nyelvben, kezdve a Simulával , az osztályokat attribútumok , metódusok , konstruktorok és destruktorok egyetlen, szorosan kapcsolódó entitásként határozzák meg. Az osztálydefiníció kész. Ez a tény volt az, ami hasznosnak tűnt Stroustrup és Ellis számára, akik ezen az alapon nem valósítottak meg mixineket C ++ nyelven nyelvi szinten (a C ++-t "kompatibilis C bővítményként a Simula felé" fejlesztették ki) .
A mixin nyelvben egy osztály csak az osztályhoz tartozó attribútumokkal és paraméterekkel van definiálva. A módszerek máshol vannak definiálva, mint például a Flavors és a CLOS , és általános függvények. Ez utóbbiak különféle típusokhoz ütemezéssel valósulnak meg.
A Flavors és a CLOS mellett a mixins a következő nyelveket támogatja:
Egy példa a Rubyban. Az osztály az életkor egyszerű fogalmát valósítja meg. Az életkor értéket az " age " belső változó tárolja , amely nyitva áll az írásra és az olvasásra. Az életkorok összehasonlításához az osztály egyetlen " <=> " operátort valósít meg, az összes többi (nagyobb, kisebb, egyenlő stb.) pedig ezzel a módszerrel valósul meg az " Összehasonlítható " belefoglaló modulban.
osztály Életkor tartalmazza Összehasonlítható attr_accessor ( :age ) def <=> ( cmp ) @age <=> cmp . kor vége végeA példa bemutatja az objektumok létrehozását és a "vegyes" módszerek használatát:
a , b = Életkor . új , Kor . új a . életkor = 10 b . életkor = 11 , ha a < b akkor " a kisebb, mint b." végeA mixineket a többszörös öröklődés hiányos megvalósításának tekinthetjük, annak egy bizonyos fajtáját. A többszörös öröklődést támogató nyelveken a mixinek könnyen emulálhatók. Például a C++ nyelvben a következő minta használható egy " != " operátor hozzáadásához egy osztályhoz, ha van " == " operátor:
template < típusnév T > struct AddNoEq { virtuális bool operátor == ( const T & cmp ) const = 0 ; bool operátor != ( const T & cmp ) const { vissza ! static_cast < const T *> ( this ) -> operátor == ( cmp ); } };A komplex számosztály egyszerű használati esete :
#include <iostream> struct Complex : public AddNoEq < Complex > { Komplex ( int re , int im ) : re_ ( re ), im_ ( im ) { } virtual bool operátor == ( const Complex & cmp ) const { return cmp . re_ == ez -> re_ && cmp . im_ == ez -> im_ ; } // ... privát : int re_ , im_ ; }; int main () { Komplex a ( 1 , 2 ), b ( 2 , 3 ); ha ( a != b ) std :: cout << "Így kell" << std :: endl ; return 0 ; }Ezt a módszert kibővített formában használja a Boost operátorok könyvtára.
A szennyeződésekhez közeli funkcionalitást olyan nyelvű interfészek biztosítják, mint a Java és a C# , azzal a különbséggel, hogy egy interfész csak a viselkedést határozza meg, de nem ad implementációt (Java-ban az 1.8-as verziótól a részleges megvalósítás megengedett egy felületen , A C# a 8.0-s verziótól kezdve bevezeti az "alapértelmezett implementáció" fogalmát). A mechanizmus csak a polimorfizmus ábrázolására használható . Más osztályok, amelyek egy interfész megvalósítását biztosítják, hasznosak a közös funkcionalitás egyetlen helyre hozásához.
A bővítési módszerek és interfészek együttes használatával lehetőség van a mixin funkcionalitás megvalósítására C# nyelven.