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

标签 matlab class methods static-methods matlab-deployment

我研究了static methods觉得静态方法在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

最佳答案

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

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

例如

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.

本质上,静态方法与如何在类/对象内部使用它们以及如何在类外部使用它们无关。/p>

使用示例:假设您有一个非常复杂的类,需要 30 个变量作为初始化。您可以创建一个名为 default_parameters() 的静态方法,该方法输出这些参数的默认值,以便用户可以修改它们,然后将它们作为构造函数的输入。

一般来说,不需要类属性值的类函数可以是静态方法。通常,这些方法被设为静态方法,不是因为您需要它们是静态的,而是因为它们在概念上是有意义的。无论如何,大多数 OOP 只是以逻辑和结构化的方式组织代码。

关于matlab 静态方法是不必要的,对吧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76872102/

相关文章:

python - 如何将实例方法用作 APscheduler 的作业并结合持久数据存储[未绑定(bind)方法错误]

python - numpy.argmax 比 MATLAB [~,idx] = max() 慢吗?

matlab - 在 matlab 中显示 3-D 图时出错

ruby - 在 Ruby 中,{1 => new "new")} 中的 ("alice"是什么意思?

python - 在 Tkinter 类 python 中居中和调整窗口框架的大小

java - 在一种方法中设置变量的值并在另一种方法中打印

c++ - std::random_device 和 std::mt19937 服从均匀分布吗?

matlab - 在 matlab 中更改电影尺寸

java 。用户的输入通过实例变量在主类中起作用,但在其他类中不起作用

java - 如何更改返回到方法的 ArrayList? - java