我尝试通过houses
的实用程序方法更改名为Static
的类中的属性。我对参考obj
感到非常困惑,因为我不知道应该在何时何地使用它。我试图绕过构造函数方法,以便我可以访问setProperty
方法,但我收到too many output arguments
之类的错误。我尝试过obj
以及x
,但我也遇到了类似的错误。但是,如果我将值传递给构造函数方法,我可以更改属性a
。
classdef houses
properties
a;
end
methods
% constructor method
function obj = houses()
end
end
methods (Static)
function setProperty(x)
obj.a = x;
end
end
end
答案 0 :(得分:2)
通常,不应使用静态方法来设置类的属性。如果您的属性是公共的,那么您可以使用静态方法,但强烈建议您不要。如果您的属性是私有/受保护的,那么您绝对不能使用静态方法来修改它。
你的类应该是这样的(我冒昧地明确说明了每个块的访问属性):
classdef houses
properties (Access = private)
a;
end
methods (Access = public)
% constructor method
function obj = houses()
end
function SetA(obj, a)
obj.a = a;
end
function DoSomething(obj, more_parameters)
% Lengthy stuff here
end
end
end
现在,关于您关于obj
的问题:答案是您必须将obj
作为每个实例方法的第一个参数。变量obj
以通用方式引用类的当前实例。例如,参见方法DoSomething
。
除非公开,否则静态方法无权访问该类的任何属性。因此,在声明静态方法时,不应传递obj
变量。
最后一件事:总是为您的属性和方法使用显式访问修饰符。它会为你节省一些麻烦。
答案 1 :(得分:1)
静态方法通常不应该访问对象(因此它无法访问obj
)。
如果要修改静态属性(由所有对象和类本身共享),可以使用以下内容:
classdef houses
properties (Static)
a;
end
methods
% constructor method
function obj = houses()
end
end
methods (Static)
function setProperty(x)
houses.a = x;
end
end
end
关于obj
,它是每个方法的第一个参数(非静态)。所以当你这样做时:
o = myClass();
o.myMethod(args);
Matlab将此视为:
myMethod(o, args);
因此,当您定义方法时,必须将obj
作为第一个参数(实际上您可以选择任何名称,它不必是obj
)。