因为一些仿真的实际需要,笔者需要用一些OOP的编程方式在MALTAB里面,主要原因还是同一系列类型的变量要复制三份,而且要最好要分离,所以还是OOP好点。看了一些文档,很多部分写的比较细致。。。额。。实际上笔者只想找到类怎么定义,怎么创建对象,构造初始化这一些比较基本的内容,故写了以下内容作为笔记,例如set,get之类的方法都没有用到。。。只求能正常使用就好。
首先是用如下直接创建了一个类,出来就是一个模板文件
其中分割还是比较明显的,第一行是类名的定义,然后成员变量一列,方法一列,和其他的OOP语言没什么区别
classdef Untitled
%UNTITLED 请在此处输入类的概要
% 请在此处输入详细说明
properties
end
methods
end
end
下面要注意的第一个地方就是在构造,如笔者直接用Untitled作为类名,其构造函数也为Untitled,按很多OOP语言习惯记得是构造不能够返回值的,但是如下
Matlab的构造必须要一个返回值,探究其为什么要返回值的相关内容省去,这个返回值实际上比较特殊,按笔者理解,实际上是这个类内部的一个引用对象,或者说内部对于匿名对象的一个引用(这么说好像也很不严谨),一般按照matlab的例程里面写成的是obj或者类名的简称,因为笔者一开始遇到的问题在于,我定义了一些成员变量,系统通过构造函数自动给这些成员变量初始化一个参数,构造函数是带初值的,如下
properties
SIFS_FLAG;
end
methods
function a=testClass(INPUT)
SIFS_FLAG=INPUT;
end
end
随便弄了一个a当做返回值,程序能跑不报错。。但是怎么赋值都不行,同样的,我要在类中间的其他方法中间访问成员变量也不行,而且不能运行,直接报错,报的还是??? Error using ==> changeAll
Too many input arguments.
这样的错误,所以很让人费解。下面附上的是正确的方式,同时PS下,如下图在调用changeAll方法的时候输入参数为一个,即INPUT部分,obj是被自动隐含的。
原因我猜想就应该是前面提到的,在类构造的时候返回的就是在这个类中间所产生的对象的引用,所有后续对这个内中间成员变量的使用都必须要通过这个引用。基本上一个MATLAB可用的OOP这样也能够用了,关于继承方面MATLAB比较方便,只需要如下这样就行了,笔者所需要的主要在于封装,所以这一部分就没有继续试试了。
PS:上面第二个函数changeAll写错了,在构造初始化成员变量的时候可以那么写,但是在实例建起来以后如果要改变成员变量不行,会默认再次重新执行一次构造函数,为什么原因不清楚。解决方法两种,一个修改参数的之后直接赋值,比如我建一个实例A,直接赋值A.SIFS_FLAG=1这样我在R2009A版本里面试是可以的。如果要写一个函数的话,那么还是要写成set或者get的形式,如function [obj] = set.属性名(obj,INPUT) 然后里面使用obj.属性名修改属性,这样才可以,否则按之前写的程序不报错,但是每次都会重新建立一个对象。