里面MATLAB在R2008a对象

戴夫·福提,MathWorks出版社

自上世纪90年代初MATLAB问世以来,软件行业已经取得了长足的发展®面向对象的编程功能首次开发。例如,使用对象的设计模式,现在是司空见惯。在随后的几年,MathWorks公司的开发人员已经了解程序员如何使用对象和他们需要的能力很大。

更新的面向对象编程功能的一个关键目标在R2008a MATLAB应用其中的一些经验教训,同时保持真正的MATLAB语言的三个核心原则:数组和数组索引的中心地位,数学函数的重要性,和使用多个输入和输出参数。

对于有经验的面向对象程序员,本文解释了R2008a中一些MATLAB设计决策背后的基本原理,包括为什么MATLAB的面向对象特性与其他流行的面向对象语言有很大的不同。特别是,本文研究了方法和参数、继承、句柄、属性和对象生命周期管理。

方法与参数

在R2008a,MATLAB保留方法定义,要求,并派遣早期版本的MATLAB的语义。这意味着,对象是明确的参数,即对其采取行动的方法。不同于许多面向对象的语言,在MATLAB阵列,或矩阵,作为中心舞台。没有特殊类型的数组,并且所有的类本质上支持数组。金宝app此外,由于MATLAB方法经常需要作用于多个对象,多个对象参数之间的对称性是在MATLAB代码更重要。例如,在MATLAB,加上与实现

功能C =加号(A,B)

在方法内,A,B和C是可以赐名适合于上下文和作为变量可能在数学方程中使用的所有变量。毕竟,方法是简单的,关于对象行为的功能。唯一的特点独特的方法是,他们可以访问类的内部(受保护的和私有的定义)。在MATLAB中,有对方法没有隐含参数。

为什么没有隐含的“此”对象在MATLAB?

在某些语言中,一个对象参数的方法总是隐含的。在这种语言中,一种方法总是作用单个标物体上而无需一个对象数组的接入元件。考虑作用的对象阵列上的MATLAB方法:

功能S =总和(X)S = 0;K = 1:长度(X)S = S + X(k)的。价值;结束结束

虽然带有隐式对象参数的语言提供“this”关键字来访问隐式对象,但它们通常不要求您通过“this”访问属性。如果MATLAB具有隐式属性,那么对基于数组的对象的逻辑扩展将是无索引:

S = S + (k).Value;

遗产

在R2008a,MATLAB介绍了一种基于一个类定义了一组具有共同特征和行为对象的想法一个新的继承模型。子类定义都表现出由超类和附加特征,而不是由父类的所有实例表现出行为限定的特征和行为的对象的子集。R2008a,事实上,MATLAB对象执行实施之前结构阵列是高度可见的和中央从其它的类继承的方式类。属于一个子类对象是一个结构包含一个字段为每个超类,并且该字段包含属于该超类的一个对象。

这种方法是,在许多方面,古朴典雅。例如,很容易使用超类的构造函数没有特殊的语法结构的子类的实例,而且很容易从子类调用父类方法的方法,您只需调用父类对象的方法包含由子类。然而,有这种模式的继承问题。

前r2008a继承模型的一个不足之处是,只能通过传递对象的超类组件来从子类方法调用超类方法。这意味着超类方法没有接收到整个对象,并且由超类方法发出的调用不会分派给子类。

新继承模型通过语义处理每一个对象作为一个不可分割的整体,不管底层的实现细节,解决了这个问题。调用父类的方法是使用语法避免了需要有一个属于超类而不是子类的实例制作。在新的模型中,一个子类的实例具有的所有属性和它的超类的方法,但一个子类对象不是超类组件(图1)的复合物。

图1.子类对象的比较。在MATLAB中,一个子类定义对象的子集。在子类的每个对象是超类的一个成员,但是具有超出由超类中定义的附加特征。到R2008a之前,子类的实例包含可用于调用父类方法的实际超实例。在R2008a,类的实例使用classdef不包含超的情况,而是支持能力调用父类对整个子类的实例方法来定义。金宝app通过这种方式,对象将保持在整个操作的单一身份。点击图片查看大图。

手柄

MATLAB定义处理类表示其标识独立于其属性值的对象。就像人或事物一样,handle对象可以在不丢失其身份的情况下改变状态。句柄更倾向于表示诸如windows或文件之类的实体,而不是数字之类的概念或数学实体(图2)。句柄在创建特定类型的数据结构时非常有用。例如,树的节点可以处理对象。每个节点都有一个基于其在树中的位置的唯一标识,但是与该节点关联的数据可能会随时间变化。

图2是用于表示作为把手的良好候选对象的示例。顺时针从左上角:文件夹或文件,树数据结构的节点,窗口和人口的个人会员。点击图片查看大图。

由于MATLAB 4,手柄已经在处理图形已经可用®。手柄提供给表示数字,轴,线和其他视觉元素对象的访问。

与数字不同,每个图形元素代表一个独特的视觉显示。特定行以特定的样式显示特定的数据段。您可以在不创建新样式的情况下更改该行样式,因为它的句柄标识了它。行句柄可以传递给函数,而不需要复制对象并创建第二行,这样就可以编写作用于现有句柄的函数,并在不同的上下文中使用不同的句柄来使用这些函数。

R2008a允许您创建自己的handle类作为handle的子类。当您希望创建表示独特物理实体或涉及对象间连接的抽象数据结构的新对象类型时,此功能非常有用。

属性

MATLAB类定义可以包含除方法之外的属性。属性是MATLAB类提供对存储在对象中的数据的访问的首选方法。面向对象编程的一个关键目标是将类的内部工作隐藏在用户界面之后。这种方法允许类实现演进,而不必强制对使用该类的代码进行代价高昂的更改。为了避免这类更改,使用c++或Java™等语言的程序员被要求保持数据成员私有,并提供公共访问方法,即使这些方法只是分配或返回一个私有数据成员。

如果MATLAB采用了类似的做法,就在C ++和Java没有看到影响。MATLAB支金宝app持可以不容易使用的方法调用来执行复杂的阵列的索引操作。例如,使用现场符号比较这简单而直接分配:

x.Data(1:2:结束,1:2:结束)= Y;

这一更加漫长和复杂的应用接入方式:

温度= x.getData;温度(1:2:结束,1:2:结束)= Y;x.setData(温度);

有些语言提供除了场性质的概念。属性使用相同的语法获取和分配作为字段,但它们允许当访问或分配的属性的类定义附加行为。在MATLAB的属性可以是简单的场刚存储的值。访问方法以后可以在不改变对象的数据被访问的方式进行添加。没有理由区分属性的字段,所以MATLABclassdef只是有属性。

对象的生命周期管理

MATLAB实现了对象的生命周期管理战略,支持析构函数,破坏尽快对象,因为他们成为任何MATLAB的工作空间可达。金宝app在MATLAB语言一直被摧毁的工作空间变量管理内存分配时,函数退出,或者通过一个错误或通过正常的返回到调用环境。我们希望保持这个简单的模型同时也延长了它(通过返回到调用功能或存储在返回到调用函数的一些其他对象)来处理可能会超出函数的执行对象。

MATLAB句柄类可以定义一个delete方法,它的行为非常像c++等语言中的析构函数(图3a和图3b)。在MATLAB中,在对象被销毁之前调用delete方法,因为对象不再可以从任何MATLAB变量中访问。delete方法可用于关闭文件、关闭外部应用程序或通知需要对第一个对象的销毁做出反应的另一个对象。它是由handle类定义的,在MATLAB中只有handle类有析构函数。这是因为MATLAB使用handle类来表示有形对象和具有唯一标识的对象。概念对象从未真正停止存在——例如,数字5不会停止存在,因为它不再被保存在一个变量中。

c++

图3a。C ++代码中使用的包装类。WidgetHandle提供一个基于堆栈的对象,该对象可以自动管理对小部件指针的多个引用,以便小部件对象在不再使用时被销毁。

类的widget {公共:窗口小部件():m_RefCount(1){}空隙acquireRef(){m_RefCount ++;}空隙releaseRef(){m_RefCount--;如果(m_RefCount == 0){删除此;}} ...类WidgetHandle {公共:WidgetHandle(){m_WidgetRef =新控件();} WidgetHandle(常量WidgetHandle&其他){m_WidgetRef = other.m_WidgetRef;m_WidgetRef-> acquireRef();} WidgetHandle运算符=(const的WidgetHandle&其他){部件* W = other.m_WidgetRef;W-> acquireRef();m_WidgetRef-> releaseRef();m_WidgetRef =瓦特; } ~WidgetHandle() { m_WidgetRef->releaseRef(); } private: Widget *m_WidgetRef; };

MATLAB

图3 b。一个等价的MATLAB类。MATLAB实现使用一个类,因为句柄超类在句柄不再使用时实现自动销毁。

classdef处理属性…结束方法……结束结束


一些程序员可能会觉得奇怪,非句柄对象没有析构函数。由于MATLAB对象销毁总是自动进行的,所以持有其他对象的非句柄对象不需要做任何事情来销毁那些其他对象。如果一个类表示在不再需要时必须释放的某个外部资源,那么应该使用handle类来表示该资源,因为它实际上不能在MATLAB中通过值来复制和传递。

为什么不在MATLAB中使用垃圾收集器呢?

我们希望避免的,因为在一个垃圾收集的环境中管理对象的生命周期相关的复杂性在MATLAB中使用垃圾收集器。例如,目前的垃圾收集环境中放弃析构函数。这意味着,他们自动内存管理,但不是全部对象的管理。对象经常使用其它资源比内存小,这是很难实现的垃圾收集可以与稀缺性的不同级别管理各种资源。另一个缺点是,垃圾收集可以使程序测试和调试更加困难,因为垃圾回收过程中所发生的活动无法容易地被重复。

总结

在R2008a,MATLAB增加了许多新的功能定义上构建对象类和维护MATLAB的基本素质。当创建MATLAB类,它是有用牢记MATLAB变量和函数的主要特点。这些措施包括事实参数和变量通常是阵列和支持数组索引和所有功能参数显式声明的命名。金宝app句柄类带有析构函数可以代表外部系统或资源。MATLAB手柄提供了一些在其他语言,包括自动内存管理引用和指针的能力,同时避免一些带有指针和垃圾收集相关的缺陷。

出版2008 - 91586v00