MATLAB CLASSES getter和setter

时间:2014-11-22 12:58:44

标签: matlab oop matlab-class

我来自Java背景。我在Matlab中遇到类问题,尤其是getter和setter。得到一条消息说句柄和价值类之间的冲突我有点迷失了什么,所以任何帮助缺乏更好的词都会有所帮助。

classdef Person
properties(Access = private)
    name;
    age; 
end


methods
    % class constructor
    function obj = Person(age,name)         
             obj.age = age;
             obj.name = name;
    end

    %getters
    function name = get.name(obj)          
    end

    function age = get.age(obj)
    end

    %setters
    function value = set.name(obj,name)
    end

    function value = set.age(obj,age)
    end

end

2 个答案:

答案 0 :(得分:6)

实施

由于您的类当前是默认Value类的子类,因此您的setter需要返回修改后的对象:

function obj = set.name(obj,name)
end
function obj = set.age(obj,age)
end

the documention:"如果将[值类]传递给函数,该函数必须返回修改后的对象。"并且in particular:"在值类中,修改对象的方法必须返回一个修改过的对象来复制现有的对象变量"。


句柄类(classdef Person < handle)不需要返回修改后的对象(如返回void):

function [] = set.name(obj,name)
end
function [] = set.age(obj,age)
end

价值与处理

更深入一点,Value类和Handle类之间的区别主要在于赋值:

  • 将值类实例分配给变量会创建该类的副本。
  • 将一个Handle类实例分配给一个变量,为该实例创建一个引用(别名)。

Mathworks在此主题上有good rundown。 为了解释他们的插图,Value类的行为是

% p  is an instance of Polynomial
p = Polynomial(); 
% p2 is also an instance of Polynomial with p's state at assignment
p2 = p;

和Handle类是

% db is an instance of Database
db = Database();
% db2 is a reference to the db instance
db2 = db;

答案 1 :(得分:0)

从Java角度来看,很快就会出现问题: - &#34;处理&#34;课程是你的思想所设定的。带有指向它们的正确对象实例。使用它们。 - &#34;价值&#34;类总是会返回任何对象的完整克隆(已经被你刚才所做的修改,例如设置名称)。

他们在Matlab中同时存在的原因是,在Matlab中你会期望&#34;值&#34;本地行为。想象一下,你有一个矩阵A = [1 2; 3 4],然后通过B = A分配。如果您现在设置B(1) = -1,那么您希望A(1)仍为1,对吧?这是因为matlab会记录&#34;副本&#34;并且在修改最初设置为相同矩阵的不同变量时真正创建它们。在OOP中,你现在拥有A(1)=-1作为对象引用的每一个。

此外,&#34;本地&#34; matlab例程没有&#34; this / self / me&#34;包含要从函数内访问的实例引用的变量。相反,惯例是类实例将被添加到函数的参数列表中。 所以对于函数调用myclass.mymethod(arg1,arg1),声明必须是

function mymethod(this, arg1, arg2)
  % Note that the name you choose for "this" is arbitrary!
end

请注意,这是java-perspective(也是我最喜欢的),上面的函数调用相当于mymethod(myclass,arg1,arg1)。这更像是matlab风格的原生,但不知何故让你更难以看到你调用对象方法。

现在,关于setter / getters:对于 handle 类,现在感觉都是java-ish:

classdef MyClass < handle

properties
   MyProp;
end

methods
   function set.MyProp(this, value)  %Note: setMyProp is also valid!
       ... % do checks etc, trigger calls, 
       this.MyProp = value; 
   end

   function value = get.MyProp(this)
       ... % notify, update, triggers etc
       value = this.MyProp; 
   end 
end

当然,如果您只是想要返回值,则不需要定义一个getter,即myclassinstance.MyProp也可以正常工作。

最后,在我7年的matlab oop中,值类的getter / setter是[从未遇到过我/我从未需要],所以我的建议是使用句柄类并享受快乐的matlab编码:-) 否则,上述说明&amp;官方matlab文档正在为值类getter / setter做好工作。