类在 MATLAB 中的角色
类
在 MATLAB® 语言中,每个值都有一个类。例如,使用赋值语句创建变量会构造适当类的变量:
a = 7; b = 'some text'; s.Name = 'Nancy'; s.Age = 64; whos
whos Name Size Bytes Class Attributes a 1x1 8 double b 1x9 18 char s 1x1 370 struct
whos
等基本命令显示工作区中每个值的类。这些信息有助于 MATLAB 用户识别某些值是字符并显示为文本,而其他值是双精度数值,等等。有些变量(如结构体)可以包含多个不同的值类。
预定义的类
MATLAB 定义了构成该语言所用的基本类型的基础类。这些类包括数值、logical
、char
、cell
、struct
和函数句柄。
用户定义的类
您可以创建自己的 MATLAB 类。例如,您可以定义类来表示多项式。该类可以定义通常与 MATLAB 类相关联的操作,如加法、减法、索引、在命令行窗口中显示等。这些操作需要执行多项式加法、多项式减法等等效操作。例如,当您将两个多项式对象相加时:
p1 + p2
plus
运算必须能够对多项式对象执行加法运算,因为多项式类定义了该运算。
在定义类时,可以重载特殊的 MATLAB 函数(如加法运算符的 plus.m
)。MATLAB 在用户将这些运算应用于您的类的对象时,会调用这些方法。
有关创建这样的类的示例,请参阅Representing Polynomials with Classes。
MATLAB 类 - 关键术语
MATLAB 类使用以下词语来说明类定义的不同部分和相关概念。
类定义 - 说明每个类实例共有的内容。
属性 - 类实例的数据存储
方法 - 一些特殊函数,用于实现通常仅对类实例执行的运算
事件 - 由类定义并在发生某个特定操作时由类实例广播的消息
特性 - 修改属性、方法、事件和类的行为的值
侦听程序 - 在广播事件通知时,通过执行回调函数来响应特定事件的对象
对象 - 类的实例,包含存储在对象属性中的实际数据值
子类 - 从其他类派生并从这些类继承方法、属性和事件的类(您可以利用子类来重用派生它们的超类中定义的代码)。
超类 - 用作创建更具体定义的类(即子类)的基础的类。
命名空间 - 定义类和函数命名作用域的文件夹
一些基本关系
本节讨论 MATLAB 类使用的一些基本概念。
类
类是一种定义,它指定类的所有实例共享的某些特征。这些特征由定义类的属性、方法和事件以及修改每个类组件行为的特性值确定。类定义说明类的对象是如何创建和销毁的,对象包含什么数据,以及如何操作这些数据。
类的层次结构
有时,您可以基于现有类来定义新类。您可以通过这种方式在代表相似实体的新类中重用设计和方法。您可以通过创建子类来实现这种重用。子类定义的对象是超类所定义对象的子集。子类比超类更具体,并且可能会在从超类继承的那些组件中添加新的属性、方法和事件。
数学集可以帮助说明类之间的关系。在下图中,Positive Integers 是 Integers 的子集,也是 Positives 的子集。这三个集都是 Reals 的子集,而 Reals 又是 All Numbers 的子集。
Positive Integers 的定义有附加设定,即要求集的成员大于零。Positive Integers 合并了 Integers 和 Positives 的定义。得到的子集比超集更具体,因此定义也更窄,但子集仍然共享定义超集的所有特征。
“是”关系是一种用来确定基于现有超集定义特定子集是否合适的好方法。例如,以下每个陈述都成立:
正整数是整数
正整数是正数
如果“是”关系成立,则很可能您可以从代表某些更一般情况的一个或多个类中定义新类。
重用解
类通常组织成各个分类,以方便代码重用。例如,如果您定义一个类以实现与计算机串行端口的接口,它可能与用来实现与并行端口的接口的类相似。为了重用代码,您可以定义一个超类,该超类包含这两类端口共有的所有内容,然后从该超类派生子类,您只需要在子类中实现每个特定端口独有的内容。然后子类将继承超类的所有共有功能。
对象
类就像一个创建该类的特定实例的模板。此实例或对象包含由该类表示的特定实体的实际数据。例如,银行帐户类的实例是表示特定银行帐户的对象,具有实际的帐号和实际余额。该对象内置了执行由类定义的操作的能力,例如向帐户存款或从帐户余额中取款。
对象不仅仅是被动的数据容器。对象还可以主动管理包含的数据,如只允许执行某些操作,隐藏不需要公开的数据,以及防止外部客户端因执行对象设计中不包含的操作而误用数据。对象甚至还可以控制它们被销毁时所发生的行为。
封装信息
对象有一个很重要的特点:在您编写的软件中,您可以通过对象的属性和方法访问存储在对象中的信息,而无需知道这些信息如何存储,甚至也无需知道查询这些信息时是否涉及存储或计算。对象将访问对象的代码与方法和属性的内部实现隔离开来。您可以定义相应的类,来对不属于类的任何方法隐藏数据和操作。然后,您可以实现任何最适合预期用途的接口。
参考
[1] Shalloway, A., J. R. Trott, Design Patterns Explained A New Perspective on Object-Oriented Design.. Boston, MA: Addison-Wesley 2002.
[2] Gamma, E., R. Helm, R. Johnson, J. Vlissides, Design Patterns Elements of Reusable Object-Oriented Software. Boston, MA: Addison-Wesley 1995.
[3] Freeman, E., Bert Bates, Kathy Sierra, Elisabeth Robson, Head First Design Patterns. O'Reilly Media, 2004.