Matlab中Static methods是否非必需?实操验证后的技术疑问
疑问:MATLAB中的静态方法是否并非必需?
我查阅了MATLAB静态方法相关文档后,认为MATLAB中的静态方法并非必需——即便不提供该特性,也不会造成使用不便。特此请教该观点是否正确?
静态方法的优势在于与具体对象无关,仅关联类,既可以在类内部调用,也可通过对象调用。但我发现,普通方法完全可以实现静态方法的所有功能:
简单示例
下面的代码中,method1未使用输入参数,可在构造函数中调用;虽然用obj.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
内容的提问来源于stack exchange,提问作者bokabokaboka
相关产品推荐
相关产品推荐

