MatLab OOP通过效用方法设置属性

时间:2014-08-06 11:02:08

标签: matlab oop

我尝试通过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

2 个答案:

答案 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)。