`
xiaoheliushuiya
  • 浏览: 404271 次
文章分类
社区版块
存档分类
最新评论

MATLAB OOP记点东西2-成员函数访问成员变量(使用静态成员函数)

 
阅读更多

还是在用MALTAB完成一些OOP编程,遇到的问题N多。。。果然是比较郁闷的,其实笔者的要求并不多,主要是希望通过类来封装每一个节点属性,要不然相同变量太多了,不好用。搞了半天问题在于,在MATLAB的一个类里面,成员变量如何去访问成员函数,额。。。其他语言都没见过这样的问题。。。MATLAB搞得非常奇怪。

先放上一个解决方案,笔者形容是凑合着用的,通过静态函数绕了一下,想起来也是怪怪的,如下


类名是test,包含一个属性NUM,基本MALTAB的HELP里面相关OOP的文档大致我都翻了一下,的确没有发现有出现在methods里面自定义函数名的,大部分都是set和get。

这里叙述纯粹按照笔者猜想,首先我们实例化一个类

TEST=test(5); 这个部分直接就会调用构造函数,入参可以没有,这里为了初始化所以设定了一个val,出参必须要有,原因和之前的一样,类的内部的一个引用,或者说实例化,最后把这个引用传给TEST。

再下来实际上我们要解决如何在成员函数里面访问成员变量,首先是MATLAB文档里面多次提到的set和get,这两个是肯定可以使用的,但是set必须是两个入参,可以有出参,但是笔者存在报错就是了,get必须有出参,而且入参只有一个。且每一个函数的第一个入参都必须是Obj,即对象。如调用set.NUM函数的时候

并不是写成test.set.NUM()或者test.NUM(),而实际上调用的方法是test.NUM=xx;这样,实际上好像这里是一个重写,虽然我定义的test类没有继承,但是应该有继承有一个默认的最高类,默认中间test.NUM=XX执行就是一个单纯的成员变量赋值的作用,而我上面所定义的实际上是对这个赋值重写,可以自定义test.NUM=xx这个动作。如

function obj=set.NUM(obj,val)
obj.NUM=val;
fprintf('%d',val);
end

这样就会在test.NUM=XX赋值的同时,print一行值。get方法和set方法类似,以上好像是matlab帮助里面常写的,但是这里笔者想实现的是比较常见的,随便定义一个成员函数名,然后执行一个动作,而set和get的.之后跟的必定是属性名,而且参数受限,所以把属性名定义成方法名的凑的思路也走不通。

本来按照道理而言,如下写法

function obj=set_NUM(obj,val)
obj.NUM=val;
end

直接是可以的,虽然我们最后还是这样写,但是要写成静态化。非静态化的调用直接test.set_NUM(xx)一个参数就行,不需要传递obj,然后程序把对象传递进去,改变一个参数的值,再传出,笔者写的《MATLAB OOP记点东西1》那部分也就到这就以为测试通过了。但是如果你再次执行这个动作的时候会发现,再传参数给set_NUM的执行过程中,obj的值是上一次对象的值,而不是用set_NUM函数改动后的,但是用test.NUM=xx这样的改动之后的结果是可以的,所以问题还是归于传入的obj到底是哪里来的,当然这个问题也没有搞明白。不过最后为了完成目的,笔者发现,如果把之上的函数放入静态函数块里面就行了。

MATLAB的静态成员函数和其他的有点不同,貌似记得其他的好像是不用实例化对象就可以直接调用的,而MATLAB的静态成员函数还是要实例化的,在定义的时候如下

methods (Static)
function obj=set_NUM(obj,val)
obj.NUM=val;
end
end

变化不是很大,就加了一个static,但是在调用的时候不一样,如笔者实例化的对象为test,即调用是

test=test.set_NUM(test,10);实际上就是手动去完成一个Obj的传递工作,虽然比较凑乎,但是笔者的基本需求达到了就是了。在MATLAB帮助实例An Example of Syntax这个里面也类似采用了这样的一种框架,故貌似。。普通method只可以在构造或者set,get函数里面使用成员变量,而其他的方法都不行。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics