2012-03-20 8 views
7

Let मैटलैब में सार वर्गों का उपयोग करते हुए हम एक अमूर्त वर्ग है:(गुण के बिना)

classdef ACalculation < handle 

    methods (Abstract) 
     [result] = calculate (this, data); 

     plot (this, data, limX, limY); 
    end 

end 

और कुछ अन्य वर्गों कि ACalculation

classdef Maximum < ACalculation 

    methods 
     function [result] = calculate (this, data) 
      %... 
     end 

     function plot (this, data, limX, limY) 
      %... 
     end 
end 

लागू करता कार्यान्वयन वर्ग के कार्यों के लिए मैं सभी की जरूरत जानकारी दे , इसलिए मुझे किसी भी गुण की आवश्यकता नहीं है। तो ऐसा लगता है कि मुझे स्थैतिक कक्षाओं की आवश्यकता है। लेकिन अगर मेरे पास स्थिर वर्ग हैं तो मुझे इन कार्यों को कॉल करने में समस्या है।

criteria = Maximum(); 
%...... 
result = criteria.calculate(data); 

यह बुरा रास्ता विरासत उपयोग करने के लिए है: मैं ऐसा ही कुछ करना चाहते हैं? क्या मुझे मैटलैब सलाहयों को स्थैतिक रूप से कार्यों को बदलने के लिए अनदेखा करना चाहिए? मैं और क्या कर सकता हूं?

उत्तर

5

मुझे लगता है कि इस मामले में, स्थिर इंटरफ़ेस कार्यान्वयन काफी अच्छा पैटर्न है। निम्नलिखित तरीके से अपनी कक्षाओं को परिभाषित करें:

function foo(acalc,data) 
     assert(isa(acalc,'ACalculation')); 
     acalc.calculate(data); 
     acalc.plot(data,[100 200]); 
end 

फिर एक Maximum खाली उदाहरण बना सकते हैं और यह foo को पारित:

classdef ACalculation < handle 

    methods (Abstract,Public,Static) 
     [result] = calculate (data);  
     plot (data, limX, limY); 
    end 

end 

classdef Maximum < ACalculation 

    methods (Public,Static) 
     function [result] = calculate (data) 
      %... 
     end 

     function plot (data, limX, limY) 
      %... 
     end 
end 

उसके बाद, आप एक समारोह एक ACalculation प्रकार को उम्मीद है कि लिख सकते हैं

foo (Maximum.empty(0), [1 2 3]); 

यदि आप गणना विधि बदलना चाहते हैं, तो

पर कॉल करें
foo (Minimum.empty(0), [1 2 3]); 

जब आप कहते हैं कि ऐसा पैटर्न काम नहीं करेगा, तो आप जावा/सी #/सी ++ डेवलपर की तरह सोच रहे हैं। लेकिन सी ++ के विपरीत जहां स्थिर और आभासी कीवर्ड सह-अस्तित्व में नहीं हो सकता है, मैटलैब की कोई सीमा नहीं है, क्योंकि सबकुछ रनटाइम पर किया जाता है, और "उदाहरण" खाली हो सकता है या n तत्वों की सरणी हो सकती है।

+0

यह काम करता है, धन्यवाद! – Lex

0

तो calculateMaximum‘, you would use ‘result = Maximum.calculate(data) की एक स्थिर विधि criteria को instantiating बिना, यह कॉल करने के लिए है।

यह विरासत का उपयोग करने के लिए एक बुरा तरीका नहीं है, या MATLAB से बुरी सलाह है।

+0

लेकिन अगर मेरे पास अन्य वर्ग भी हैं (न्यूनतम, मीन और इतने पर) मैं शुरुआत में कहीं भी चुनना चाहता हूं, जिसका उपयोग इस प्रकार किया जाता है और इसके बाद अमूर्त वर्ग की कुछ वस्तु का उपयोग करके, यह कहने के बिना कि यह वास्तव में कौन सा वर्ग है। इस मामले में मैं स्थिर का उपयोग नहीं कर सकता, है ना? – Lex