从 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 做这项工作。