我来自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
端
答案 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类之间的区别主要在于赋值:
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
作为对象引用的每一个。
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做好工作。