रचना बनाम विरासत से निपटने के दौरान भाषा अप्रासंगिक है। यदि आप समझते हैं कि कक्षा क्या है और कक्षा के उदाहरण क्या है, तो आपको अपनी आवश्यकता है।
संरचना तब होती है जब कक्षा अन्य कक्षाओं के बनायी जाती है; या इसे एक और तरीका कहने के लिए, किसी ऑब्जेक्ट का एक उदाहरण अन्य ऑब्जेक्ट्स के उदाहरणों के संदर्भ में है।
विरासत तब होती है जब किसी वर्ग को किसी अन्य वर्ग से विधियों और गुणों को प्राप्त होता है।
मान लें कि आपके पास दो कार्यक्षमता, ए और बी हैं। आप एक तीसरी कार्यक्षमता को परिभाषित करना चाहते हैं, सी, जिसमें ए या बी दोनों के कुछ या सभी हैं, आप या तो बी और ए से सी बढ़ा सकते हैं, इस मामले में सी में सबकुछ बी और ए है क्योंकि सी isA
बी और ए, या आप सी के प्रत्येक उदाहरण को ए का एक उदाहरण और बी का उदाहरण दे सकते हैं, और उन कार्यक्षमताओं पर वस्तुओं का आह्वान कर सकते हैं। बाद के मामले में, प्रत्येक उदाहरण सी प्रभाव में बी के एक उदाहरण और ए
बेशक, भाषा के आधार पर, हो सकता है कि आप कक्षा 2 कक्षाओं (जैसे जावा एकाधिक विरासत का समर्थन नहीं करते हैं), लेकिन यह एक भाषा विशिष्ट विवरण है जिसमें अवधारणा से कोई लेना देना नहीं है।
अब, भाषा विशेष जानकारी के लिए ...
मैं शब्द वर्ग इस्तेमाल किया, लेकिन जावास्क्रिप्ट जैसे क्लास का बोध भी नहीं है। इसमें वस्तुओं हैं, और यह है (सरल प्रकारों के अलावा)। जावास्क्रिप्ट प्रोटोटाइप विरासत का उपयोग करता है, जिसका अर्थ है कि इसमें वस्तुओं को कुशलतापूर्वक परिभाषित करने और उन वस्तुओं पर विधियों का एक तरीका है (यह किसी अन्य प्रश्न का विषय है; आप एसओ खोज सकते हैं क्योंकि पहले से ही उत्तर हैं।)
तो हमारे उदाहरण के साथ जा रहा है ऊपर, आप ए, बी, और सी
विरासत के लिए, आप
// define an object (which can be viewed as a "class")
function A(){}
// define some functionality
A.prototype.someMethod = function(){}
होता आप सी ए का विस्तार करना चाहता था, तो आप
करना होगा है
अब सी के प्रत्येक उदाहरण विधि someMethod
, क्योंकि सी "ईसा" ए के प्रत्येक उदाहरण
जावास्क्रिप्ट (इस पर बाद में अधिक) एकाधिक वंशानुक्रम * नहीं है के लिए होता है, तो आप सी का विस्तार नहीं हो सकता ए और बी दोनों आप कार्यक्षमता का उपयोग कर सकते हैं, हालांकि, इसे कार्यक्षमता देने के लिए।दरअसल, यह कुछ कारणों से रचना को प्राथमिकता के कारणों में से एक है; कार्यक्षमता संयोजन पर कोई सीमा नहीं है (लेकिन यह एकमात्र कारण नहीं है)।
function C(){
this.a = new A();
this.b = new B();
}
// someMethod on C invokes the someMethod on B.
C.someMethod = function(){
this.a.someMethod()
}
तो विरासत और संरचना दोनों के लिए आपके सरल उदाहरण हैं। हालांकि, यह कहानी का अंत नहीं है। मैंने पहले कहा था कि जावास्क्रिप्ट एकाधिक विरासत का समर्थन नहीं करता है, और एक अर्थ में ऐसा नहीं होता है, क्योंकि आप किसी ऑब्जेक्ट के प्रोटोटाइप को एकाधिक ऑब्जेक्ट्स के प्रोटोटाइप से आधार नहीं बना सकते हैं; क्योंकि जैसे ही आप तीसरे, रेखा करते हैं, तो आप सिर्फ दूसरी पंक्ति undid यानी आप
C.prototype = new B();
C.prototype.constructor = B;
C.prototype.constructor = A;
नहीं कर सकते। इसका instanceof
ऑपरेटर के लिए प्रभाव पड़ता है।
बहरहाल, यह वास्तव में, कोई फर्क नहीं पड़ता क्योंकि सिर्फ इसलिए कि आप एक वस्तु के निर्माता दो बार फिर से परिभाषित नहीं कर सकते, आप किसी भी ऐसे तरीकों आप चाहते हैं एक वस्तु के प्रोटोटाइप के लिए जोड़ सकते हैं। तो सिर्फ इसलिए कि आप ऊपर के उदाहरण ऐसा नहीं कर सकते, आप अभी भी कुछ भी जोड़ सकते हैं आप C.prototype को, दोनों ए और बी
कई चौखटे के प्रोटोटाइप पर सभी तरीकों सहित इस समर्थन करते हैं और यह चाहते हैं आसान। मैं बहुत सारे स्प्राउटकोर काम करता हूं; कि ढांचे के साथ आप कर सकते हैं
A = {
method1: function(){}
}
B = {
method2: function(){}
}
C = SC.Object.extend(A, B, {
method3: function(){}
}
यहाँ मैं वस्तु शाब्दिक A
और B
में कार्यक्षमता में परिभाषित किया गया है, और फिर C
करने के लिए दोनों की कार्यक्षमता जोड़ा है, इसलिए सी के प्रत्येक उदाहरण के तरीकों 1, 2, और 3 इस में विशेष मामला, extend
विधि (ढांचे द्वारा प्रदान की गई) वस्तुओं के प्रोटोटाइप को स्थापित करने के सभी भारी भारोत्तोलन करता है।
संपादित करें - आपकी टिप्पणियों में, आप एक अच्छा सवाल लाते हैं, अर्थात् "यदि आप संरचना का उपयोग करते हैं, तो आप मुख्य वस्तु के दायरे के मुख्य उद्देश्य के दायरे के खिलाफ मुख्य वस्तु के दायरे को कैसे जोड़ते हैं"।
कई तरीकों से हैं। सबसे पहले तर्क पारित करने के लिए है। तो
C.someMethod = function(){
this.a.someMethod(arg1, arg2...);
}
यहां आप स्कॉप्स से गड़बड़ नहीं कर रहे हैं, आप बस तर्कों को पार कर रहे हैं। यह एक सरल और बहुत व्यवहार्य दृष्टिकोण है। एक अन्य तरीका यह जावास्क्रिप्ट, जो मूल रूप से आप एक के दायरे से स्थापित करने के लिए अनुमति देता है की call
(या apply
) तरीकों का उपयोग करने के लिए किया जाएगा करने के लिए (तर्क this
से आ सकता है या में पारित किया जाना है, जो कुछ ...)
समारोह।
C.someMethod = function(){
this.a.someMethod.call(this, arg1, arg2...);
}
में थोड़ा और अधिक स्पष्ट होना, निम्नलिखित बराबर
C.someMethod = function(){
var someMethodOnA = this.a.someMethod;
someMethodOnA.call(this, arg1, arg2...);
}
जावास्क्रिप्ट में है, काम करता है, वस्तु हैं ताकि आप उन्हें चर को असाइन कर सकते।
call
मंगलाचरण यहाँ this
को someMethodOnA
के दायरे, जो सी
प्रश्न बहुत अस्पष्ट है। शायद [programmers.se] के लिए बेहतर फिट (http://programmers.stackexchange.com)। –
यदि यह बहुत अस्पष्ट है, तो आईएमओ यह किसी भी साइट के लिए उपयुक्त नहीं है। –
मैं और अधिक विशिष्ट कैसे हो सकता है? मैं विरासत का उपयोग कर कोड प्रस्तुत करता हूं, अब मुझे रचना का उपयोग करके इसे बनाने में दिलचस्पी है। अन्य प्रश्न भी हैं जो अन्य भाषाओं के लिए समान हैं। – Brian