Main Content

类在 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 定义了构成该语言所用的基本类型的基础类。这些类包括数值、logicalcharcellstruct 和函数句柄。

用户定义的类

您可以创建自己的 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 的定义。得到的子集比超集更具体,因此定义也更窄,但子集仍然共享定义超集的所有特征。

Venn diagram showing relationships between sets of numbers

“是”关系是一种用来确定基于现有超集定义特定子集是否合适的好方法。例如,以下每个陈述都成立:

  • 正整数是整数

  • 正整数是正数

如果“是”关系成立,则很可能您可以从代表某些更一般情况的一个或多个类中定义新类。

重用解

类通常组织成各个分类,以方便代码重用。例如,如果您定义一个类以实现与计算机串行端口的接口,它可能与用来实现与并行端口的接口的类相似。为了重用代码,您可以定义一个超类,该超类包含这两类端口共有的所有内容,然后从该超类派生子类,您只需要在子类中实现每个特定端口独有的内容。然后子类将继承超类的所有共有功能。

对象

类就像一个创建该类的特定实例的模板。此实例或对象包含由该类表示的特定实体的实际数据。例如,银行帐户类的实例是表示特定银行帐户的对象,具有实际的帐号和实际余额。该对象内置了执行由类定义的操作的能力,例如向帐户存款或从帐户余额中取款。

对象不仅仅是被动的数据容器。对象还可以主动管理包含的数据,如只允许执行某些操作,隐藏不需要公开的数据,以及防止外部客户端因执行对象设计中不包含的操作而误用数据。对象甚至还可以控制它们被销毁时所发生的行为。

封装信息

对象有一个很重要的特点:在您编写的软件中,您可以通过对象的属性和方法访问存储在对象中的信息,而无需知道这些信息如何存储,甚至也无需知道查询这些信息时是否涉及存储或计算。对象将访问对象的代码与方法和属性的内部实现隔离开来。您可以定义相应的类,来对不属于类的任何方法隐藏数据和操作。然后,您可以实现任何最适合预期用途的接口。

参考

[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.

相关主题