类的定义

类是描述现实世界中真实对象的代码集合。类相当于模板,提供对真实对象的主要静态特征(属性)和动态特征(方法)的描述。用类模板生成实例,就是对象。这个对象是真实对象基于类代码的抽象。可以生成很多对象,给每个对象赋予不同的属性就可以模拟现实世界中不同的真实对象,结合方法、事件可以模拟现实世界他们之间的相互关系。[大谦MATLAB,dqmatlab点com]

MATLAB类用代码块进行定义。

生成类的块

MATLAB组织类的时候,将代码组织成块,如下所示,每个块以关键词开始,以end语句结束:

classdef…end:定义所有类组件。

properties…end:声明属性名,定义属性并指定默认值。

methods…end:声明方法签名,定义方法和函数代码。

enumeration…end:声明枚举类的成员和值。

properties, methods和enumeration都是关键字,它们只用在calssdef块中。

类定义块

类文件中的classdef块包含类的定义代码,以classdef关键字开始,以end语句结束。

code.matlab
classdef(ClassAttributes) ClassName < SuperClass
    ...
end

ClassAttributes定义类的特性,SuperClass定义类的父类,即继承性。如果有多个父类,各父类名称之间用“&”连接。例如下面的LinkedList类继承自Array类和handle类。

code.matlab
classdef LinkedList < Array & handle
    ...
end

例如,下面的classdef定义一个名为Myclass的类,它继承自handle类,但是不能用作其它类的父类。

code.matlab
classdef(Sealed) MyClass < handle
    ...
end

一个类文件只能定义一个类,但是,可以向包含classdef块的文件添加本地函数。本地函数的作用范围仅限于该类文件,它可以访问私有和受保护的类成员。

code.matlab
classdef ClassName
    ...
end
function localFunction
    ...
end

属性块

属性块包含属性的定义代码,以properties关键字开始,以end语句结束。

code.matlab
classdef ClassName
    properties(PropertyAttributes)
        ...
    end
    ...
end

例如,下面的类定义一个名为Prop1的私有属性,默认值等于date函数的输出,即当前日期。

code.matlab
classdef MyClass
    properties(Access=private)
        Prop1=date
    end
    ...
end

下面的代码定义3个属性。Model和Color属性使用默认值,作为公共接口可读可写。SerialNumber是只读属性,给该属性赋值只能在本类的构造函数或其它类方法中进行。

code.matlab
classdefNewCar
    properties
        Model
        Color
    end
    properties(SetAccess=private,GetAccess=public)
        SerialNumber
    end
    methods
        ...
    end
end

使用点标记可以获取属性的值。

code.matlab
A=NewCar
A =
    NewCar with properties:
    Model: []
    Color: []
    SerialNumber: []

设置Model和Color属性的值。

code.matlab
A.Model='XGT7000';
A.Color='Red';

给NewCar类添加一个构造函数,设置属性值。

code.matlab
classdef NewCar
    properties
        Model
        Color
    end
    properties(SetAccess=private,GetAccess=public)
        SerialNumber
    end
    methods
        function obj=NewCar(model,color)
            obj.Model=model;
            obj.Color=color;
            obj.SerialNumber=datenum(datetime('now'));
        end
    end
end

在MATLAB命令窗口键入:

code.matlab
A=NewCar('XGT7000','Red')

返回

code.matlab
A=
NewCarwithproperties:
Model:'XGT7000'
Color:'Red'
SerialNumber:7.362456078531134e+05

方法块

方法块包含定义类方法的函数,以methods关键字开始,以end语句结束。

code.matlab
classdef ClassName
	properties
		PropertyName
	end
	methods
		function obj=ClassName(arg1,...)
			obj.PropertyName=arg1;
			...
		end
		function ordinaryMethod(obj,arg1,...)
			...
		end
	end
	methods(Static)
		function staticMethod(arg1,...)
			...
		end
	end
end

上面代码中,有Static的为静态方法,没有的为一般方法。方法不同,调用的方法也有所不同。对于下面代码定义的一般方法:

code.matlab
classdef MyClass
	methods
		function out=ordinaryMethod(obj,arg1)
			...
		end
	end
end

可以用MATLAB函数语法或点标记两种方式调用一般方法:

code.matlab
obj=MyClass;
r=ordinaryMethod(obj,arg1);
r=obj.ordinaryMethod(arg1);

一个完整的类

下面列出的是一个完整的类的定义,包含上面各种块的组合。

code.matlab
classdef(Sealed)MyClass<handle
    properties(Access=private)
        Prop1=datenum(date)
    end
    properties
        Prop2
    end
    methods
        function obj=MyClass(x)
            obj.Prop2=x;
        end
    end
    methods(Access={?MyOtherClass})
        function d=myMethod(obj)
            d=obj.Prop1+x;
        end
    end
end

枚举类

MATLAB中用enumeration块定义枚举,以enumeration关键字开始,以end语句结束。

code.matlab
classdef ClassName < SuperClass
    enumeration
        EnumerationMember
    end
    ...
end

例如,下面的类定义两个枚举成员,表示逻辑上的false和true。

code.matlab
classdef Boolean < logical
    enumeration
        No(0)
        Yes(1)
    end
end