我来自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
结束
发布于 2014-11-22 15:41:49
实现
由于您的类当前是默认值类的子类,所以您的设置程序需要返回修改过的对象:
function obj = set.name(obj,name)
end
function obj = set.age(obj,age)
end
如果将值类传递给函数,则该函数必须返回修改过的对象。和特别是:“在值类中,修改对象的方法.必须返回修改过的对象才能复制现有的对象变量”。
Handle类(classdef Person < handle
)不需要返回修改过的对象(比如返回void
):
function [] = set.name(obj,name)
end
function [] = set.age(obj,age)
end
价值与手柄
更深一点的是,Value类和Handle类的区别主要在于赋值:
Mathworks有一个关于这个主题的精疲力竭。套用它们的说明,值类的行为是
% p is an instance of Polynomial
p = Polynomial();
% p2 is also an instance of Polynomial with p's state at assignment
p2 = p;
而句柄类的
% db is an instance of Database
db = Database();
% db2 is a reference to the db instance
db2 = db;
发布于 2015-01-30 20:36:55
从Java的角度来看,from‘n Dirty:- "handle“类是您的思维所设置的。具有指向它们的指针的适当对象实例。用它们。- "value“类总是返回任何对象的完整克隆(该对象已被您刚才所做的修改,例如设置名称)。
两者都存在于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风格的本土化,但不知怎的,这会使您更难看到您正在调用对象方法。
现在,关于setters/getters:对于处理类,现在感觉一切都是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
也可以在没有任何值的情况下工作。
最后,值类的getter/getter在我7年的matlab oop中从来没有遇到过我/我从来没有遇到过,所以我的建议是使用句柄类并享受matlab的快乐编码:-)否则,上面的解释&官方matlab文档正在为值类getter/getter工作。
https://stackoverflow.com/questions/27077642
复制相似问题