属性在面向对象的 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 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

Python 面向对象进阶

MATLAB 中的 GPU 编码器,用于大量面向对象的代码

面向对象思想(第一天)

面向对象初识

Mooc软件工程-03面向对象分析与设计

程序员小白如何理解面向对象?