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

结尾

4

2 回答 2

8

执行

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

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

来自文档:“如果将 [a value class] 传递给函数,则该函数必须返回修改后的对象。” 特别是: “在值类中,修改对象的方法......必须返回修改后的对象以复制现有的对象变量”。


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

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

价值与句柄

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

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

Mathworks对这个主题有很好的概述。套用他们的说明,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;
于 2014-11-22T15:41:49.667 回答
1

从 Java 的角度来看 Quick'n Dirty: - “句柄”类是您的想法。带有指向它们的指针的正确对象实例。使用它们。- “值”类总是返回任何对象的完整克隆(已被您刚刚所做的修改,例如设置名称)。

它们在 Matlab 中都有的原因是,在 Matlab 中,您会期望本机的“价值”行为。想象一下你有一个矩阵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 风格,但不知何故使您更难看到您正在调用对象方法。

现在,关于 setter/getter:对于句柄类,现在一切都感觉是 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

myclassinstance.MyProp当然,如果您只想返回值,则无需定义 getter,即无需任何方法也可以正常工作,这是不言而喻的。

最后,在我 7 年的 matlab oop 中,值类的 getter/setter 是 [从未遇到过我/我从来不需要] 的东西,所以我的建议是使用句柄类并享受快乐的 matlab 编码:-) 否则,以上解释和官方 matlab 文档正在为值类 getter/setter 做这项工作。

于 2015-01-30T20:36:55.650 回答