2012-03-20 64 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