मान लें कि मेरे पास वर्ग MyClass
का ऑब्जेक्ट है। MyClass
में एक विधि compute
है, और जब मैं U = compute(X,...)
पर कॉल करता हूं, तो मैटलैब स्वचालित रूप से कक्षा विधि को कॉल करता है। हालांकि, मैं वास्तव में क्या चाहता हूं कि किसी अन्य फ़ंक्शन को कॉल करना है जिसे compute
भी कहा जाता है जिसका पैरामीटर MyClass
ऑब्जेक्ट से शुरू होता है। क्लास विधि में जाने के बजाए मैं इस नियमित कार्य को कॉल करने के लिए मैटलैब को कैसे मजबूर करूं?क्लास विधि के बजाय नियमित कार्य को कॉल करने के लिए मैटलैब को कैसे बल दिया जाए जब वे अधिभारित होते हैं?
उत्तर
फ़ंक्शन के नाम या स्थान पर कुछ बदलाव किए बिना ऐसा करने का कोई तरीका नहीं है। यदि आप Matlab's function precedence order चेक करते हैं, तो सामान्य सामान्य कार्यों से पहले विधियां हमेशा चलती हैं। आपके एकमात्र व्यावहारिक विकल्प हैं:
- फ़ंक्शन का नाम बदलें।
- एक ही स्क्रिप्ट है कि (उपरोक्त सूची में आइटम 4) समारोह बुला रहा है
- एक फ़ोल्डर अपनी स्क्रिप्ट फ़ाइल (पर आइटम 5 को उसी फ़ोल्डर में
private
कहा जाता है के लिए समारोह के मीटर फ़ाइल स्थानांतरित करने समारोह के शरीर ले जाएँ सूची)
अद्यतन
हालांकि छोटी परियोजनाओं के लिए काफी व्यावहारिक नहीं, आप भी packaging your functions पर गौर कर सकते हैं। this SO post में एक अच्छी चर्चा मिल सकती है।
समस्या यह है कि मैं फ़ंक्शन नाम को ' compute2', matlab अभी भी क्लास विधि को कॉल करने की कोशिश करता है और 'त्रुटि 2' को 'MyClass' में परिभाषित नहीं किया गया है, क्योंकि त्रुटि' रिपोर्टिंग को घुमाया गया है ... – OneZero
वास्तव में यदि आपने नियमित रूप से 'compute2' के रूप में नामित किया है तो इसे सही ढंग से कॉल किया जाएगा (I बस इसे R2013a में आजमाएं) – Amro
@OneZero याद रखें कि आपको उस फ़ंक्शन वाले फ़ंक्शन नाम और फ़ाइल नाम दोनों को बदलने की आवश्यकता है। तो उदाहरण के लिए आप 'compute2.m' फ़ाइल के अंदर' function x = compute2 (obj) 'के साथ समाप्त हो जाएंगे। – Bee
अपने compute
एक MATLAB निर्मित होने वाला हैं, तो आप
builtin('compute', ...)
अन्यथा उपयोग कर सकते हैं, वहाँ कोई रास्ता नहीं है - मधुमक्खी के जवाब देखें।
अच्छा बिंदु। मैंने अभी माना है कि उसके 'गणना' फ़ंक्शन कस्टम ऑब्जेक्ट को पहले पैरामीटर के रूप में स्वीकार करता है, यह एक अंतर्निहित फ़ंक्शन नहीं है। – Bee
@ बीई: सच। सभी संभावनाओं में ओपी एक बिल्टिन से निपट नहीं रहा है। लेकिन कोई और हो सकता है: पी –
यदि आपको इसकी अत्यधिक आवश्यकता है, तो आप निम्न की तरह कुछ कर सकते हैं। मैं दृढ़ता से सुझाव देता हूं कि आप नहीं करते, और मधुमक्खी के जवाब से चिपके रहते हैं। हालांकि, कभी-कभी किसी के पास कोई विकल्प नहीं है ...
विचार आपके उदाहरण को किसी अन्य वर्ग में लपेटना है ताकि MATLAB के फ़ंक्शन प्रेषण को compute
विधि दिखाई न दे। हालांकि, आपके compute
फ़ंक्शन पर, लपेटा हुआ उदाहरण मूल उदाहरण के समान दिखाई देना चाहिए। कुछ मामलों में यह सही पाने के लिए मुश्किल है, लेकिन अक्सर निम्नलिखित पर्याप्त है:
classdef Wrapper
properties (Access = 'private', Hidden = true)
core = [];
end
methods
function this = Wrapper(core)
this.core = core;
end
function varargout = subsref(this, S)
if nargout > 0
varargout = cell(1, nargout);
[varargout{:}] = subsref(this.core, S);
else
subsref(this.core, S);
end
end
end
end
इस वर्ग एक और वर्ग और प्रतिनिधियों सब लिपटे उदाहरण को पढ़ने का एक उदाहरण गिर्द घूमती है।
classdef TestClass
properties
name = '';
end
methods
function this = TestClass(name)
this.name = name;
end
function compute(this)
fprintf('Instance method! My name is "%s".\n', this.name);
end
end
end
और एक समारोह compute.m
:
function compute(x)
fprintf('Regular function! My name is "%s".\n', x.name);
end
तो यह इस तरह काम करता है:
उदाहरण के लिए, एक फ़ाइल TestClass.m
कहा जाता है अगर आपके पास
>> t = TestClass('t');
>> s = struct('name', 's');
>> compute(t)
Instance method! My name is "t".
>> compute(s)
Regular function! My name is "s".
>> w = Wrapper(t);
>> compute(w)
Regular function! My name is "t".
पर निर्भर करता है क्या compute
फ़ंक्शन आपके उदाहरण के साथ मील करता है ght को Wrapper
पर आगे "विशेष" फ़ंक्शन जोड़ने की आवश्यकता है (उदा। subsasgn
)। यह भी ध्यान रखें कि अगर compute
कुछ मेटाक्लास-जादू करता है तो यह टूट जाएगा।
- 1. एक अमूर्त कार्यान्वित विधि को कॉल करने के लिए सबक्लास को कैसे बल दें
- 2. बेस क्लास अधिभारित विधि
- 3. एक फॉर्मेटास्टिक फॉर्म के लिए विधि को कैसे बल दिया जाए?
- 4. निरंतर कार्य में किसी कार्य से अपवाद को कैसे बल दिया जाए?
- 5. "लागू करें" फ़ंक्शंस के क्या फायदे हैं? लूपों के बजाय "वे" उपयोग करने के लिए बेहतर कब होते हैं, और वे कब नहीं होते?
- 6. कैसे अतिभारित को अस्पष्ट संदर्भ तय करने के लिए लागू होते हैं() विधि जब Json
- 7. स्मृति जारी करने के लिए सार्वभौमिक अनुप्रयोग को कैसे बल दिया जाए?
- 8. रैखिक प्रतिगमन में शून्य अवरोध को कैसे बल दिया जाए?
- 9. गैर-अमूर्त विधि को ओवरराइड करने के लिए बल
- 10. ऑब्जेक्ट के कचरे के संग्रह को कैसे बल दिया जाए, आप अपमान नहीं कर सकते?
- 11. मैं कार्य रद्दीकरण को कैसे बल दूं?
- 12. ओवरराइडिंग विधि लागू होने पर विधि कॉल (बेस क्लास में) को कैसे लागू किया जाए?
- 13. कॉल आधार विधि के बजाय ओवरराइड
- 14. संपत्ति परिवर्तन के बाद विधि को कॉल करने के लिए
- 15. जब किसी विधि के साइड इफेक्ट्स होते हैं?
- 16. क्लास विधि के भीतर किसी फ़ंक्शन को कॉल करना?
- 17. आईओ मोनड में शुद्ध मूल्य के मूल्यांकन को सही ढंग से कैसे बल दिया जाए?
- 18. एएसपी.नेट एमवीसी 3: एचटीपीजीट के बजाय एचटीपीपोस्ट करने के लिए एक्शनलिंक को कैसे बल दें?
- 19. 'हां/नहीं' निर्णयों के पेड़ को बलपूर्वक कैसे बल दिया जाए?
- 20. fgetcsv() विशेष वर्णों को अनदेखा करते हैं जब वे लाइन की शुरुआत में होते हैं!
- 21. पांडा की तुलना करना। समानता के लिए सामान जब वे नैन होते हैं?
- 22. विरासत वर्गों में एक स्थिर कार्य को पुन: कार्यान्वित करने के लिए बल
- 23. संदेशबॉक्स को प्रोग्रामेटिक रूप से बंद करने के लिए बल
- 24. क्लास विधियों को ओवरराइड करने के लिए कैसे करें
- 25. "फ़ंक्शन कॉल" ऑपरेटर को अधिभारित करने के लिए यह कैसे उपयोगी हो सकता है?
- 26. सी ++ और ओपनजीएल में किसी अन्य फ़ंक्शन के लिए तर्क के रूप में क्लास विधि को कैसे पास किया जाए?
- 27. जब वे डिस्पोजेड होते हैं तो मैं ReClerView के ViewHolders से OnClickListeners को कैसे हटा सकता हूं?
- 28. @ नियम के ऑर्डरिंग को संभालने के लिए कैसे करें जब वे एक दूसरे पर निर्भर हैं
- 29. मैटलैब क्लास
- 30. शैडोडॉम बनाम दस्तावेज़ टुकड़े - वे अलग कैसे होते हैं?
कोई कारण नहीं है कि दोनों संस्करण सदस्य विधियां क्यों नहीं हैं? आप बाहरी फ़ंक्शन को क्लास की स्थिर विधि भी बना सकते हैं, इस तरह इसे अलग-अलग कहा जाता है: 'MyClass.compute (x) 'बनाम' गणना (x)' – Amro