当前位置:  开发笔记 > 编程语言 > 正文

属性如何在面向对象的MATLAB中工作?

如何解决《属性如何在面向对象的MATLAB中工作?》经验,为你挑选了2个好方法。

我正在尝试使用一个成员变量来创建一个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  

Azim.. 26

使用香草类

使用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

更新:使用香草类

正如Kamran所指出的那样,上述Request问题的实例中的方法定义需要更改为包含testprop类型的输出参数.

谢谢卡姆兰.



1> Azim..:

使用香草类

使用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

更新:使用香草类

正如Kamran所指出的那样,上述Request问题的实例中的方法定义需要更改为包含testprop类型的输出参数.

谢谢卡姆兰.



2> Marc..:

你必须记住在Matlab中的语法,你可能比C++或Java更接近C,至少在对象方面.因此,您想要更改值对象的"内容"(实际上只是一个特殊的struct),您需要从函数返回该对象.

Azim是正确的指出,如果你想要Singleton行为(从你的代码,你似乎),你需要使用"句柄"类.从Handle派生的类的实例都指向单个实例,并且仅对其进行操作.

您可以阅读有关Value和Handle类之间差异的更多信息.


从`handle`派生本身并不构成Singleton模式.
推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有