matlab 静态方法是不必要的,对吗?

问题描述 投票:0回答:1

我研究了静态方法,感觉静态方法在matlab中不是必需的。如果matlab不提供静态方法也没有什么不便。不知道我的上述观点是否正确? 静态方法的好处是“与具体对象无关”,只与类相关。可以在类内部调用。也可以被对象调用! 我发现我可以用普通方法做静态方法所做的事情! 这是一个简单的示例。method1 没有使用输入参数。我可以在构造函数中使用method1。虽然程序使用'obj.method1'来调用method1,但这并不意味着method1与任何特定对象相关。

classdef test<handle     
    properties
        X
        Y
    end
    
    methods
        function obj = test(inputArg1,inputArg2)
            obj.X = inputArg1 + inputArg2;
            obj.Y=obj.method1(inputArg2);
        end
    end
    methods
        function value = method1(obj,inputArg)
            value = 3 + 3;
        end
    end    
end

这里有一个更复杂的例子。使用面向对象的编程方法绘制三维曲面图。需要定义两个类,其中一个类存储函数的数据,并在该类中使用静态方法计算区间的网格坐标;另一个类的功能是绘制三维曲面图,绘制过程是通过静态方法实现的。

@MfunEval/MfunEval.m

classdef  MfunEval
        properties
          HFun;    
          Lm = [-2*pi 2*pi];     
        end
        properties (Dependent = true)
          Data;          
        end
        methods
           function obj = MfunEval(fun_handle,limits)   %Constructor
               obj.HFun = fun_handle;
               obj.Lm = limits;
           end
           function data = get.Data(obj)      %
             [x,y] = MfunEval.grid(obj.Lm);  
             z= obj.HFun(x,y);
             data.X = x;
             data.Y = y;
             data.Z = z;
           end
        end
        methods (Static)      %Static methods
           function [x,y] = grid(lim)   
                step = (lim(2)-lim(1))/50;
               [x,y] = meshgrid(lim(1):step:lim(2));
           end
        end
    end

@MfunView/MfunView.m

classdef MfunView
        properties
          FunObj          
          HSurf           
        end
        methods
           function obj = MfunView(fobj)  %Constructor
             obj.FunObj= fobj;
           end
        end  
        methods (Static = true)           %
            createViews(a)                %
        end  
    end    

@MfunView/createViews.m

function  createViews(funevalobj)
      viewobj=MfunView(funevalobj);
      viewobj.HSurf = surf(viewobj.FunObj.Data.X,...
          viewobj.FunObj.Data.Y,...
          viewobj.FunObj.Data.Z);
      shading interp;
    end    

我修改了 @MfunEval/MfunEval.m 将 MfunEval.grid 替换为 obj.grid。我将静态方法更改为普通方法。程序还能运行!

classdef  MfunEval
    properties
        HFun;    
        Lm = [-2*pi 2*pi];    
    end
    properties (Dependent = true)
        Data;          
    end
    methods
        function obj = MfunEval(fun_handle,limits)   %Constructor
            obj.HFun = fun_handle;
            obj.Lm = limits;
        end
        function data = get.Data(obj)      
            %[x,y] = MfunEval.grid(obj.Lm);
            [x,y] = obj.grid(obj.Lm);  %call grid function
            z= obj.HFun(x,y);
            data.X = x;
            data.Y = y;
            data.Z = z;
        end
    end
    methods %(Static)      %change Static
        function [x,y] = grid(obj,lim)    
            step = (lim(2)-lim(1))/50;
            [x,y] = meshgrid(lim(1):step:lim(2));
        end
    end
end
matlab class methods static-methods matlab-deployment
1个回答
0
投票

我认为您混淆了静态方法的用例。

当然,您可以在对象内部使用普通方法和静态方法。 静态方法的要点是在对象的外部使用,而不创建对象。

例如

classdef MfunEval properties Lm; very_large_matrix; end properties (Dependent = true) Data; end methods function obj = MfunEval() %Constructor obj.Lm = MfunEval.largeLim(); % this can be also non-static, doesn't matter, its INSIDE the object already. % obj.LM = obj.largeLim(); % equivalent to above. obj.very_large_matrix = zeros(10000000000000000000,100000000000000000); end end methods (Static) %Static methods function [lim]= largeLim() lim=[-100, 100] end end methods (Static) %Static methods function [lim]= smallLim() lim=[-2, 2] end end end
对于这里的例子,后面的方法是静态的还是不在构造函数内部,这无关紧要。但是,在您的主代码中,您现在可以执行以下操作

lim=MfunEval.smallLim() % does not construct an object, just calls the function a=MfunEval; % Ouch! It has created a 1000000000000x10000000000 zeros matrix and you run out of memory lim=a.smallLim() % works, but a needs to have been instantiated, so you provably ran out of memory.
本质上,

static

方法与如何在类/对象内部
使用它们无关,而与如何在类外使用它们无关。 使用示例:假设您有一个非常复杂的类,需要 30 个变量作为初始化。您可以创建一个名为

default_parameters()

的静态方法,它输出这些参数的默认值,以便用户可以修改它们,然后将它们作为构造函数的输入。

    

© www.soinside.com 2019 - 2024. All rights reserved.