मिक्सिन बनाम वंशानुक्रम


जवाबों:


66

एक मिश्रण आमतौर पर कई विरासत के साथ प्रयोग किया जाता है। तो, इस अर्थ में, "कोई अंतर नहीं है"।

विस्तार यह है कि एक मिश्रण एक स्वसंपूर्ण वस्तु के रूप में शायद ही कभी उपयोगी होता है।

उदाहरण के लिए, मान लें कि आपके पास "ColorAndDimension" नाम का एक मिक्सिन है, जो एक रंग संपत्ति और चौड़ाई और ऊंचाई जोड़ता है।

अब, आप कह सकते हैं ColorAndDimension a, कहते हैं, आकृति वर्ग, स्प्राइट वर्ग, कार वर्ग, आदि और वे सभी एक ही इंटरफ़ेस होंगे (जैसे get / setColor, get / setHeight / Width, आदि)

तो, सामान्य मामले में एक मिश्रण IS विरासत है। लेकिन आप यह तर्क दे सकते हैं कि समग्र डोमेन में वर्ग की भूमिका की बात यह है कि क्या एक मिश्रण "प्राथमिक" वर्ग है या केवल एक मिश्रण है।


संपादित करें - केवल स्पष्ट करने के लिए।

हां, आज के आधुनिक लिंगो में एक इंटरफेस को एक संबद्ध कार्यान्वयन के साथ एक इंटरफेस माना जा सकता है। यह वास्तव में सिर्फ सादा, पुराना, हर रोज़ एक से अधिक वंशानुक्रम का उपयोग करके एक सादा, पुराना, हर रोज़ वर्ग है। यह सिर्फ एमआई का एक विशिष्ट अनुप्रयोग होता है। अधिकांश भाषाएँ मिक्सिन को कोई विशेष दर्जा नहीं देती हैं; यह केवल एक वर्ग है जिसे "स्टैंड इन" के बजाय "मिश्रित" होने के लिए डिज़ाइन किया गया था।


29

मिक्सिन और इनहेरिटेंस के बीच अंतर क्या है?

एक मिक्स-इन एक बेस क्लास है जिसे आप अतिरिक्त कार्यक्षमता प्रदान करने के लिए विरासत में प्राप्त कर सकते हैं। स्यूडोकोड उदाहरण:

class Mixin:
    def complex_method(self):
        return complex_functionality(self)

"मिक्स-इन" नाम इंगित करता है कि इसे अन्य कोड के साथ मिश्रित करने का इरादा है। इस प्रकार, यह अनुमान है कि आप मिक्स-इन क्लास को अपने दम पर नहीं भेजेंगे। निम्न ऑब्जेक्ट के पास कोई डेटा नहीं है, और यह complex_method को कॉल करने के लिए इसे तुरंत करने का कोई मतलब नहीं है। (आप उस मामले में एक वर्ग के बजाय केवल एक फ़ंक्शन को परिभाषित कर सकते हैं।)

>>> obj = Mixin()

अक्सर मिक्स-इन का उपयोग अन्य आधार वर्गों के साथ किया जाता है।

इसलिए मिश्रण एक उपसमुच्चय, या विशेष मामला है, विरासत का।

एकल इनहेरिटेंस पर मिक्स-इन का उपयोग करने के फायदे यह हैं कि आप एक बार कार्यक्षमता के लिए कोड लिख सकते हैं, और फिर कई अलग-अलग वर्गों में समान कार्यक्षमता का उपयोग कर सकते हैं। नुकसान यह है कि आपको उस कार्यक्षमता को अन्य स्थानों पर देखने की आवश्यकता हो सकती है, जहां इसका उपयोग किया जाता है, इसलिए उस नुकसान को अपने पास रखकर इसे कम करना अच्छा है।

मुझे व्यक्तिगत रूप से एकल वंशानुक्रम का उपयोग करने के लिए आवश्यक मिला है, जहां हम बहुत से समान कोड को हटा रहे हैं, लेकिन परीक्षण मामलों को उनके आधार मामले की विरासत के आधार पर त्वरित किया जाता है, और कोड को पास रखने का एकमात्र तरीका है हाथ (और एक ही मॉड्यूल में), कवरेज नंबरों के साथ खिलवाड़ किए बिना, ऑब्जेक्ट से विरासत में मिला है, और उनके पास यूनिवर्सल टेस्ट-केस बेस और उन पर लागू होने वाले कस्टम बेस दोनों से बच्चे के मामले हैं।

तुलना बेस कक्षाओं के साथ तुलना और कंट्रास्ट में मिश्रण

दोनों माता-पिता वर्ग का एक रूप है जिसका तात्पर्य तात्कालिक होना नहीं है।

एक मिक्सिन कार्यक्षमता प्रदान करता है, लेकिन इसका सीधे उपयोग करने में असमर्थ है। एक उपयोगकर्ता को एक (उप) वर्ग के माध्यम से इसका उपयोग करने का इरादा है।

एक सार आधार वर्ग एक इंटरफ़ेस प्रदान करता है, लेकिन उपयोग करने योग्य कार्यक्षमता के बिना। एक उपयोगकर्ता को इंटरफ़ेस द्वारा बुलाए गए कार्यक्षमता को बनाने का इरादा है।

class Abstraction(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def complex_method(self):
        return complex_functionality(self)

यहाँ आपको इस ऑब्जेक्ट को तत्काल करने से रोका गया है क्योंकि इसे एक ठोस विधि के साथ कार्यक्षमता को लागू करने के लिए एक उपवर्ग की आवश्यकता होती है (हालांकि आप भीतर से कार्यक्षमता तक पहुंच सकते हैं super()):

>>> obj = Abstraction()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstraction with
abstract methods complex_method

पायथन में, abcमॉड्यूल में कुछ कक्षाएं मूल वर्गों के उदाहरण हैं जो दोनों विरासत और सार इंटरफेस के माध्यम से कार्यक्षमता प्रदान करते हैं जिन्हें उपवर्ग द्वारा लागू किया जाना चाहिए। ये विचार परस्पर अनन्य नहीं हैं।

सारांश

सीधे शब्दों में कहें, एक मिक्स-इन सिर्फ एक आधार वर्ग है जिसे आप अपने दम पर नहीं रोक सकते हैं, और आमतौर पर बहु ​​विरासत में माध्यमिक आधार वर्ग के रूप में उपयोग किया जाता है।


18

मिक्स-इन कार्यान्वयन के प्रयोजनों के लिए (बहु) विरासत का एक विशिष्ट, प्रतिबंधित मामला है; कुछ भाषाएँ (उदाहरण के लिए रूबी) सामान्यीकृत कई विरासतों का समर्थन किए बिना इसका समर्थन करती हैं।


7

मिक्सिन एक अमूर्त अवधारणा है और इसकी आवश्यकता को पूरा करने वाली किसी भी चीज़ को मिक्सिन माना जा सकता है।

यहां विकिपीडिया की एक परिभाषा दी गई है।

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, एक मिक्सिन एक ऐसा वर्ग है जिसमें अन्य वर्गों द्वारा उपयोग किए जाने के तरीके शामिल हैं, उन अन्य वर्गों के मूल वर्ग के बिना। उन अन्य वर्गों को मिक्सिन के तरीकों तक पहुंच कैसे प्राप्त होती है यह भाषा पर निर्भर करता है। मिश्रण को कभी-कभी "विरासत में मिला" के बजाय "शामिल" बताया जाता है।

संक्षेप में, विरासत से मुख्य अंतर यह है कि मिश्रण-इन्स को विरासत में "जैसे-" संबंध होने की आवश्यकता नहीं है।

कार्यान्वयन के दृष्टिकोण से, आप इसे कार्यान्वयन के साथ एक इंटरफ़ेस के रूप में सोच सकते हैं। उदाहरण के लिए, जावा में एक सार वर्ग को मिक्सिन के रूप में माना जा सकता है यदि जावा कई विरासत का समर्थन करता है।


बोल्ड वाक्य को समझने के लिए मुझे कठिन समय मिल रहा है। ऐसा लगता है कि "A से अंतर (B का?) है कि यह (B?) को A की तरह कुछ चाहिए।" आप अंतर या समानता के बारे में बात कर रहे हैं?
रायलूओ

@RayLuo Whoops ... मैंने कुछ टाइपो बनाया। आपको भ्रमित करने के लिए क्षमा करें। मिक्स-इन्स
एलेक्स

3

"एक मिश्रण एक वर्ग का एक टुकड़ा है इस अर्थ में कि इसे अन्य वर्गों या मिश्रणों के साथ बनाने का इरादा है।" -DDJ

एक मिश्रण एक वर्ग या कोड टुकड़ा है जो स्टैंड-अलोन उपयोग के लिए अभिप्रेत नहीं है, लेकिन इसके बजाय आप इसे किसी अन्य वर्ग के अंदर उपयोग करने वाले हैं। या तो एक सदस्य क्षेत्र / चर के रूप में या एक कोड खंड के रूप में रचना। मेरे पास बाद के लिए सबसे अधिक जोखिम है। यह कॉपी-पेस्ट करने वाले बॉयलरप्लेट कोड से थोड़ा बेहतर है।

यहाँ एक महान डीडीजे लेख है जो विषय का परिचय देता है।

द हाफ-लाइफ 2 / "सोर्स" एसडीके सी ++ मिश्रण का एक बड़ा उदाहरण है। उस वातावरण में मैक्रोज़ कोड के बड़े आकार के ब्लॉकों को परिभाषित करते हैं जिन्हें कक्षा को एक विशिष्ट "स्वाद" या सुविधा देने के लिए जोड़ा जा सकता है।

स्रोत विकी उदाहरण देखें: एक तार्किक इकाई का लेखन । उदाहरण के कोड में DECLARE_CLASS मैक्रो को मिक्सिन माना जा सकता है। स्रोत एसडीके डेटा-एक्सेस कोड को मानकीकृत करने और संस्थाओं के साथ व्यवहारों का वर्णन करने के लिए बड़े पैमाने पर मिश्रण का उपयोग करता है।


0

एकाधिक वंशानुक्रम के साथ, कई सुपरक्लास से नए वर्ग की रचना की जा सकती है। आप किसी भी सुपरक्लेसेस में परिभाषित विधियों को ही कॉल कर सकते हैं।

दूसरी ओर, मिक्सिन एक अमूर्त उपवर्ग है, जिसका उपयोग विभिन्न प्रकार के मूल वर्गों के बीमर का विशेषज्ञ करने के लिए किया जा सकता है। मिक्सिंस एक विधि कह सकते हैं (उदाहरण के लिए sayHello(): String) भले ही वे ऐसी विधि को परिभाषित न करें।

mixin M {
    name: String
    defmethod greetings() { print sayHello() + " " + name}
}

जैसा कि आप देखते हैं, sayHello()भले ही आप कहीं भी परिभाषित न हों, तब भी कॉल कर सकते हैं । यदि आप मिश्रण Mको वर्ग में जोड़ते हैं C, Cतो sayHello()विधि प्रदान करनी चाहिए ।


1
अपने पहले कथन की शुद्धता के बारे में निश्चित नहीं हैं - कक्षाएं अपने स्वयं के तरीकों को परिभाषित कर सकती हैं
यूजीनमी

0

मुझे लगता है कि इसका ध्यान रखना महत्वपूर्ण है, कि मिक्सिन का अर्थ विरासत में नहीं है । विकिपीडिया के अनुसार, एक Mixin है:

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, एक मिक्सिन एक ऐसा वर्ग है जिसमें अन्य वर्गों द्वारा उपयोग किए जाने के तरीके शामिल हैं, उन अन्य वर्गों के मूल वर्ग के बिना। उन अन्य वर्गों को मिक्सिन के तरीकों तक पहुंच कैसे प्राप्त होती है यह भाषा पर निर्भर करता है। मिश्रण को कभी-कभी "विरासत में मिला" के बजाय "शामिल" बताया जाता है।

विशेष रूप से, पर्ल जैसी भाषा में, एक्सपोर्टर मॉड्यूल का उपयोग करके मिश्रण को जोड़ा जा सकता है:

package Mixins;

use Exporter qw(import);
our @EXPORT_OK = qw(pity);

# assumes it will be mixed-in to a class with a _who_do_i_pity method
sub pity {
    my ($self) = @_;
    printf("I pity %s\n", $self->_who_do_i_pity('da foo'));
}

जो एक समय में एक, या अधिक, विधि से युक्त किसी भी मॉड्यूल में मिश्रित हो सकता है:

package MrT

use Mixins qw(pity);

sub new {
    return bless({}, shift);
}

sub _who_do_i_pity {
    return 'da foo!'
}

फिर अपने MrTमॉड्यूल में इस प्रकार इस्तेमाल किया जा सकता है:

use MrT;

MrT->new()->pity();

मुझे इसका एक बेतुका उदाहरण पता है, लेकिन, यह इस बिंदु को पार करता है ...


0

tl; डॉ

मिक्सिन और मल्टीपल इनहेरिटेंस का एक ही रूप है। लेकिन अलग-अलग शब्दार्थ हैं: मिश्रण में बुनियादी कक्षाएं हैं जो फ़ंक्शन कार्यान्वयन प्रदान करती हैं। विरासत के लिए, आधार वर्ग इंटरफ़ेस प्रदान करते हैं और उपवर्ग का कार्यान्वयन होता है।

लेकिन वैसे भी, मिश्रित आईएमओ पर रचना को प्राथमिकता दी जाती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.