属性在面向对象的 MATLAB 中如何工作?
Posted
技术标签:
【中文标题】属性在面向对象的 MATLAB 中如何工作?【英文标题】:How do properties work in Object Oriented MATLAB? 【发布时间】:2010-09-17 13:32:13 【问题描述】:我正在尝试创建一个带有成员变量的 MATLAB 类,该成员变量由于方法调用而被更新,但是当我尝试更改类中的属性时(显然,根据我从 MATLAB 的内存管理中了解到的)创建对象的副本,然后对其进行修改,保持原始对象的属性不变。
classdef testprop
properties
numRequests=0;
end
methods
function Request(this, val)
disp(val);
this.numRequests=this.numRequests+1;
end
end
end
.
>> a=testprop;
>> a.Request(9);
>> a.Request(5);
>> a.numRequests
ans = 0
【问题讨论】:
编辑了我的答案以考虑您的编辑。 哦,啊...我仍在使用 R2006b,我猜他们终于在 MATLAB 中制作了“真正的”类(过去很痛苦) 【参考方案1】:使用香草类
使用 vanilla 类时,您需要告诉 Matlab 存储对象的修改副本以保存属性值的更改。所以,
>> a=testprop
>> a.Request(5); % will NOT change the value of a.numRequests.
5
>> a.Request(5)
5
>> a.numRequests
ans =
0
>> a=a.Request; % However, this will work but as you it makes a copy of variable, a.
5
>> a=a.Request;
5
>> a.numRequests
ans =
2
使用句柄类
如果你继承自句柄类,那就是
classdef testprop < handle
然后你就可以写了,
>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans =
2
更新:使用 Vanilla 类
正如Kamran 上面提到的那样,问题示例代码中Request
方法的定义需要更改为包含testprop 类型的输出参数。
谢谢卡姆兰。
【讨论】:
是的 - 这说明了问题,虽然第 8 行的意思是 this.numRequests=this.numRequests+1;【参考方案2】:您必须记住,在 Matlab 中的语法上,您可能比 C++ 或 Java 更接近 C,至少在对象方面是这样。因此,如果您想更改值对象的“内容”(实际上只是一个特殊的struct
),您需要从函数中返回该对象。
Azim 正确地指出,如果您想要 Singleton 行为(从您的代码来看,您似乎是这样),您需要使用“句柄”类。从 Handle 派生的类的实例都指向一个实例,并且只对其进行操作。
你可以read more about the differences between Value and Handle classes.
【讨论】:
派生自handle
本身并不会形成单例模式。
链接不再指向我认为的意图。 Here is an updated link.【参考方案3】:
我创建了 testprop 类并尝试执行 Azim 建议的代码,但没有成功。当我执行以下命令时:
a=a.Request(1)
产生了以下错误:
???使用 ==> 请求时出错 输出参数过多。
我认为问题在于我们在声明 Request 方法时没有确定任何输出。所以我们应该把它改成:
function this = Request(this, val)
现在:
>> a = testprop;
>> a = a.Request(1);
>> a.numRequests
ans = 1
【讨论】:
如果“testprop”要写成标准/普通类,你需要从“Request”返回对象。如果“testprop”是从句柄类派生的,则不需要返回任何内容。您只需使用调用“a.Request(1);”。 是的,你是对的,但正如在问题中,Azim 假设 testprop 类的定义不是从句柄类派生的。所以他应该修改了“Request”方法。 @Kamran,刚刚检查过,你是对的。当我测试 Vanilla 案例时,我必须包含 Request 的输出参数。感谢您的澄清。以上是关于属性在面向对象的 MATLAB 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章