2013-07-10 8 views
5

मान लें कि मेरे पास वर्ग MyClass का ऑब्जेक्ट है। MyClass में एक विधि compute है, और जब मैं U = compute(X,...) पर कॉल करता हूं, तो मैटलैब स्वचालित रूप से कक्षा विधि को कॉल करता है। हालांकि, मैं वास्तव में क्या चाहता हूं कि किसी अन्य फ़ंक्शन को कॉल करना है जिसे compute भी कहा जाता है जिसका पैरामीटर MyClass ऑब्जेक्ट से शुरू होता है। क्लास विधि में जाने के बजाए मैं इस नियमित कार्य को कॉल करने के लिए मैटलैब को कैसे मजबूर करूं?क्लास विधि के बजाय नियमित कार्य को कॉल करने के लिए मैटलैब को कैसे बल दिया जाए जब वे अधिभारित होते हैं?

+1

कोई कारण नहीं है कि दोनों संस्करण सदस्य विधियां क्यों नहीं हैं? आप बाहरी फ़ंक्शन को क्लास की स्थिर विधि भी बना सकते हैं, इस तरह इसे अलग-अलग कहा जाता है: 'MyClass.compute (x) 'बनाम' गणना (x)' – Amro

उत्तर

6

फ़ंक्शन के नाम या स्थान पर कुछ बदलाव किए बिना ऐसा करने का कोई तरीका नहीं है। यदि आप Matlab's function precedence order चेक करते हैं, तो सामान्य सामान्य कार्यों से पहले विधियां हमेशा चलती हैं। आपके एकमात्र व्यावहारिक विकल्प हैं:

  1. फ़ंक्शन का नाम बदलें।
  2. एक ही स्क्रिप्ट है कि (उपरोक्त सूची में आइटम 4) समारोह बुला रहा है
  3. एक फ़ोल्डर अपनी स्क्रिप्ट फ़ाइल (पर आइटम 5 को उसी फ़ोल्डर में private कहा जाता है के लिए समारोह के मीटर फ़ाइल स्थानांतरित करने समारोह के शरीर ले जाएँ सूची)

अद्यतन

हालांकि छोटी परियोजनाओं के लिए काफी व्यावहारिक नहीं, आप भी packaging your functions पर गौर कर सकते हैं। this SO post में एक अच्छी चर्चा मिल सकती है।

+0

समस्या यह है कि मैं फ़ंक्शन नाम को ' compute2', matlab अभी भी क्लास विधि को कॉल करने की कोशिश करता है और 'त्रुटि 2' को 'MyClass' में परिभाषित नहीं किया गया है, क्योंकि त्रुटि' रिपोर्टिंग को घुमाया गया है ... – OneZero

+0

वास्तव में यदि आपने नियमित रूप से 'compute2' के रूप में नामित किया है तो इसे सही ढंग से कॉल किया जाएगा (I बस इसे R2013a में आजमाएं) – Amro

+0

@OneZero याद रखें कि आपको उस फ़ंक्शन वाले फ़ंक्शन नाम और फ़ाइल नाम दोनों को बदलने की आवश्यकता है। तो उदाहरण के लिए आप 'compute2.m' फ़ाइल के अंदर' function x = compute2 (obj) 'के साथ समाप्त हो जाएंगे। – Bee

2

अपने compute एक MATLAB निर्मित होने वाला हैं, तो आप

builtin('compute', ...) 

अन्यथा उपयोग कर सकते हैं, वहाँ कोई रास्ता नहीं है - मधुमक्खी के जवाब देखें।

+0

अच्छा बिंदु। मैंने अभी माना है कि उसके 'गणना' फ़ंक्शन कस्टम ऑब्जेक्ट को पहले पैरामीटर के रूप में स्वीकार करता है, यह एक अंतर्निहित फ़ंक्शन नहीं है। – Bee

+1

@ बीई: सच। सभी संभावनाओं में ओपी एक बिल्टिन से निपट नहीं रहा है। लेकिन कोई और हो सकता है: पी –

2

यदि आपको इसकी अत्यधिक आवश्यकता है, तो आप निम्न की तरह कुछ कर सकते हैं। मैं दृढ़ता से सुझाव देता हूं कि आप नहीं करते, और मधुमक्खी के जवाब से चिपके रहते हैं। हालांकि, कभी-कभी किसी के पास कोई विकल्प नहीं है ...

विचार आपके उदाहरण को किसी अन्य वर्ग में लपेटना है ताकि 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 कुछ मेटाक्लास-जादू करता है तो यह टूट जाएगा।

+0

+1। अच्छा जांचत्मक काम! – Bee

+0

कि अंतिम 'doStuff (डब्ल्यू) 'गणना' होना चाहिए (डब्ल्यू)'। वर्कअराउंड के लिए +1, लेकिन मैं भी असली कोड में इसका उपयोग करने की अनुशंसा नहीं करता :) – Amro

+0

@Amro: धन्यवाद, तय। यह मेरे परीक्षण-और-त्रुटि कोड से बचे हुए थे। –

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

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