MATLAB类的获取器和设置器

5

我来自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个回答

8

实现

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

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

根据文档:“如果您将[值类]传递给函数,则该函数必须返回修改后的对象。”而且特别指出:“在值类中,修改对象的方法必须返回修改后的对象以复制到现有的对象变量。”
句柄类(classdef Person < handle)不需要返回经过修改的对象(就像返回void一样):
function [] = set.name(obj,name)
end
function [] = set.age(obj,age)
end

值类型 vs. 引用类型

深入了解后,值类型和引用类型的区别主要在于赋值:

  • 将值类型实例分配给变量会创建该类的副本。
  • 将引用类型实例分配给变量会创建对该实例的引用(别名)。

The Mathworks有一个很好的介绍关于这个话题。 为了简化他们的说明,值类型的行为是

% 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;

3
使用句柄类时,不需要写成 [] = set.name(obj,name) 的形式。只需要使用 set.name(obj,name) 即可。 - Sam Roberts

1

从Java的角度来看,快速且不太规范的做法是: - “handle”类是您心中所设想的,具有指向它们的适当对象实例的指针。使用它们。 - “value”类总是返回一个对象的完整副本(由您刚刚修改的内容,例如设置名称)。

Matlab拥有这两种类型的原因是,在Matlab中,您预期本地具有“value”行为。想象一下,您有一个矩阵A = [1 2; 3 4],然后通过B = A进行分配。如果现在设置B(1)=-1,您希望A(1)仍然是1,对吧?这是因为Matlab会跟踪“副本”,并在您最初设置为相同矩阵的不同变量上修改时真正创建它们。在OOP中,现在您会有A(1)=-1,因为每个东西都是对象引用。

此外,“本地”Matlab例程没有包含包含实例引用以从函数内部访问的“this/self/me”变量。相反,约定是类实例将被添加到函数参数列表的开头。 因此,对于函数调用myclass.mymethod(arg1,arg1),声明必须是

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

请注意,这是Java的视角(也是我最喜欢的视角),上述函数调用相当于mymethod(myclass,arg1,arg1)。这更符合Matlab风格,但在某种程度上使调用对象方法变得更困难。
现在,关于设置器/获取器:对于句柄类,一切感觉都像Java:
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

当然,如果您只想返回值,即myclassinstance.MyProp也可以正常工作,那么您无需定义getter。最后,对于值类而言,我在7年的matlab oop中从未遇到过需要使用getter/setter,因此我的建议是使用句柄类并享受愉快的matlab编程:-)否则,上述解释和官方matlab文档可以处理值类的getter/setter。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接