2012-03-20 108 views
7

讓我們有一個抽象類:在Matlab使用抽象類(無屬性)

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); 

是否使用繼承壞的方式? 我應該忽略matlab建議將功能更改爲靜態? 我還能在這裏做什麼?

回答

5

我認爲在這種情況下,靜態接口實現是一個很好的模式。 定義你的類以下列方式:

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類型的函數:

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

然後創建一個Maximum空實例,並把它傳遞給foo

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

如果要更改計算方法,請致電

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

當你說這樣的模式不起作用時,你就像Java/C#/ C++開發人員一樣思考。但與C++不同,靜態虛擬關鍵字不能共存,Matlab沒有這樣的限制,因爲一切都是在運行時完成的,而一個「實例」可以是空的或者是一個數組元素。

+0

它的工作原理,謝謝! – Lex 2012-03-20 15:24:33

0

如果calculate是一個靜態方法Maximum‘, you would use ‘result = Maximum.calculate(data)來調用它,而不實例化爲criteria

這不是(必然)使用繼承的壞方法,或者來自MATLAB的不好的建議。

+0

但是,如果我還有其他類(最小值,平均值等),我想在開始時選擇某個地方,使用類型,然後使用抽象類的某個對象,而不會說明它是哪一類。在這種情況下,我不能使用靜態,不是嗎? – Lex 2012-03-20 13:03:07