我正在编写一个简单的 MATLAB 类,它具有一些属性和一个方法。类的构造函数使用默认值初始化属性。类的方法在类被构造之后获得额外的输入以更新类属性。
classdef classTest
properties
p1
p2
p3
p4
end
methods
function obj = classTest()
obj.p1 = 0;
obj.p2 = 0;
obj.p3 = [];
obj.p4 = '';
end
function obj = updateSomeProperties( obj, p1 )
obj.p1 = p1;
end
end
end
但是,当我调用该类的方法时,它不会更新属性。
>> b = classTest
b =
classTest with properties:
p1: 0
p2: 0
p3: []
p4: ''
>> b.updateSomeProperties(10)
ans =
classTest with properties:
p1: 10
p2: 0
p3: []
p4: ''
>> b % still used the default values.
b =
classTest with properties:
p1: 0
p2: 0
p3: []
p4: ''
我想知道为什么在调用类的方法后,b
虽然没有更新updateSomeProperties
更新类对象。
问题是你的班级是value作为副本传递的类(甚至传递给它自己的方法)。这是 MATLAB 类的默认行为,因为这就是所有基本 MATLAB 数据类型都是 http://www.mathworks.com/help/matlab/matlab_oop/comparing-handle-and-value-classes.html#brgm8v3。我们可以通过查看您调用的输出来验证情况是否如此updateSomeProperties()
。您将看到返回的结果(显示为ans
) 包含您期望的修改,但这些更改不存在于您的原始对象中,b
。如果您想坚持使用值类,则需要从方法返回新对象,并在调用方法时重新分配变量。
b = classTest();
b = b.updateSomeProperties(10);
你想要的是一个handle始终通过引用传递的类。这允许方法在same对象而不是修改原始对象的副本。
为此,您需要从内置继承handle http://www.mathworks.com/help/matlab/ref/handle-class.html class.
classdef classTest < handle
有句柄类和值类的详细比较在文档中 http://www.mathworks.com/help/matlab/matlab_oop/comparing-handle-and-value-classes.html?refresh=true.
作为旁注,可以简单地在构造函数中指定这些默认值,而不是在构造函数中手动设置所有默认属性值。properties
阻止自己。
properties
p1 = 0;
p2 = 0;
p3 = [];
p4 = '';
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)