2009-05-13 13 views

उत्तर

15

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

42

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

विस्तार यह है कि एक मिक्स इन स्टैंडअलोन ऑब्जेक्ट के रूप में शायद ही कभी उपयोगी होता है।

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

अब, आप कलर एंड डिमेंशन को, कहें, आकार वर्ग, एक स्प्राइट क्लास, एक कार क्लास इत्यादि जोड़ सकते हैं और वे सभी एक ही इंटरफ़ेस (कहें/सेट रंग, प्राप्त/सेट हाइट/चौड़ाई इत्यादि) कहेंगे।)

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

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

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

3

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

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

Here's a great DDJ article that introduces the subject.

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

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

0

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

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

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

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

+1

सुनिश्चित करें कि आपके पहले बयान की सत्यता के बारे में नहीं से अधिक पसंद किया जाता है - वर्गों के लिए अपने स्वयं के तरीकों – EugeneMi

15

मिश्रण और विरासत के बीच क्या अंतर है?

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

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

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

mixins और सार आधार वर्ग

साथ कंट्रास्ट दोनों माता पिता वर्ग का एक रूप है कि instantiated करने का इरादा नहीं है।

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

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

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

सारांश

बस रखो, एक मिश्रण में सिर्फ एक आधार वर्ग आप अपने आप ही का दृष्टांत नहीं होता है, और आमतौर पर एकाधिक विरासत में एक माध्यमिक आधार वर्ग के रूप में प्रयोग किया जाता है।

0

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

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

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

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 मॉड्यूल में

thusly इस्तेमाल किया जा सकता:

use MrT; 

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

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

2

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

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

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

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

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

+0

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

+0

@RayLuo Whoops ... मैंने कुछ टाइपो बनाया है। आपको भ्रमित करने के लिए खेद है। मिक्स-इन्स को "एक-ए" संबंध होने की आवश्यकता नहीं है – Alex

0

टीएल; डॉ

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

लेकिन वैसे भी, रचना mixin IMO

संबंधित मुद्दे