我研究了静态方法,感觉静态方法在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.
本质上,static
方法与如何在类/对象内部使用它们无关,而与如何在类外使用它们无关。 使用示例:假设您有一个非常复杂的类,需要 30 个变量作为初始化。您可以创建一个名为
default_parameters()
的静态方法,它输出这些参数的默认值,以便用户可以修改它们,然后将它们作为构造函数的输入。