技术文章和通讯

在MATLAB在R2008a对象

戴夫Foti MathWorks


软件行业已经演变自1990年代初以来,在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) =和= 0;k = 1:长度(X) = S + X (k) value;结束结束

而语言与一个隐式对象参数提供一个“这个”关键字访问隐式对象,他们通常不需要你通过“这”访问属性。如果MATLAB隐式属性,基于数组对象的逻辑延伸将是指数没有:

S = S + (k) value;

继承

R2008a, MATLAB引入了一个新的遗传模型的基础上,认为一个类定义了一组对象的共同特征和行为。定义一个子类对象表现出特征的子集和行为定义的超类和额外的特征和行为表现出父类的所有实例。R2008a之前,MATLAB对象实现了使用这一事实结构体数组是高度可见和中央从其他类继承的类。一个对象是一个属于一个子类结构体为每个父类包含一个字段,该字段包含属于超类的一个对象。

这种方法,在许多方面,简单而优雅。例如,很容易使用超类构造函数构造子类实例没有特殊的语法,并且很容易从子类调用父类方法方法简单地调用超类的方法对象包含子类。然而,这个模型的继承问题。

pre-R2008a继承模型的一个缺陷是,可以从一个子类调用父类方法方法只通过超类对象的组件。这意味着超类方法没有收到整个对象,并调用超类的方法不会派遣到子类。

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

matlab_objects_fig1_w.gif
图1所示。子类对象的比较。在MATLAB中,定义了一个子集的一个子类对象。每个对象的子类父类的一个成员,但附加功能之外定义的超类。R2008a之前,子类实例包含实际超类的实例,可以用来调用超类方法。在R2008a,定义类的实例使用classdef不含超类的实例,而是支持能力整个子类实例上调用超类方法。金宝app通过这种方式,在整个操作对象维护一个标识。点击图片查看放大图。

处理

MATLAB定义了处理类代表对象的身份独立于它们的属性的值。就像一个人或事情,处理对象可以改变状态而不失去自己的身份。处理往往代表有形像windows或文件而不是概念或数学实体数据(图2)。他们是有用的用于创建特定类型的数据结构。例如,树的节点可以处理对象。每个节点都有一个独特的身份基于其位置在树上,但与该节点相关的数据可以随时间变化的。

matlab_objects_fig2_w.gif
图2。的例子作为处理对象,都非常适合表示。顺时针方向从左上角:文件夹或文件,树的节点数据结构,窗户,个别成员的人口。点击图片查看放大图。

MATLAB 4日以来,处理在处理图形®。处理提供对象代表人物,轴,线,和其他视觉元素。

与数字,每个图形元素代表一个独特的视觉显示。一个特定的行显示一个特定的数据与一个特定的风格。你可以改变这条线样式不创建一个新的,因为它处理确认。行处理可以传递给一个函数没有复制对象和创建一个二线,让你编写的函数执行现有的处理和使用这些功能在不同的上下文中有不同的处理。

R2008a允许您创建自己的处理类的子类处理。这个功能是非常有用的,当你想创建新的对象,表示独特的物理实体或抽象数据结构涉及对象之间的连接。

属性

MATLAB类定义可以包含属性除了方法。属性的首选方法是一个MATLAB类提供对数据存储在对象的访问。面向对象编程的一个关键目标是隐藏类的内部运作背后的用户界面。这种方法允许类实现进化没有迫使昂贵的代码使用类的变化。为了避免这些变化,程序员在语言(如c++或Java™教保持私有数据成员和提供公共访问方法,即使这些方法仅仅分配或返回一个私有数据成员。

如果MATLAB采用类似的方法,就会影响未见的c++和Java。MATLAB支金宝app持复杂的数组索引操作,不能轻易使用方法调用执行。例如,作业比较简单和直接使用字段符号:

x。数据(1:2:最终,1:2:结束)= y;

这个更冗长和复杂的使用访问方法:

temp = x.getData;临时(1:2:最终,1:2:结束)= y;x.setData(临时);

有些语言提供的概念属性除了字段。使用相同的语法属性访问和赋值字段,但是他们允许类定义附加属性访问或分配时的行为。一个属性在MATLAB可以简单领域只是存储一个值。访问方法可以添加后不改变对象访问数据的方式。没有理由区分字段和属性,所以MATLABclassdef只有属性。

对象生命周期管理

MATLAB实现的策略对象生命周期管理,支持析构函数和破坏对象就成为遥不可及的MATLAB的工作区。金宝appMATLAB语言一直由破坏内存分配管理工作空间变量函数退出时,通过一个错误或正常返回到调用上下文。我们想保留这个简单的模型,还扩展到处理的对象可能持续超越函数的执行(被返回给调用函数或存储在其他对象返回给调用函数)。

MATLAB处理类可以定义一个delete方法,表现得非常像一个析构函数在c++等语言(图3和图3 b)。在MATLAB中,删除方法被调用之前一个对象被摧毁,因为对象可以从任何MATLAB不再访问变量。删除方法可用于关闭一个文件,关闭外部应用程序,或通知另一个对象需要应对第一个对象的破坏。它被定义为处理类,只有以MATLAB处理类析构函数。这是因为MATLAB使用句柄类代表有形对象和对象具有独特的身份。概念性对象从未真正停止存在的例子中,5号不停止存在,因为它不再是在一个变量。

c++

图3。使用一个包装器类c++代码。WidgetHandle提供了一个基于堆栈的对象,可以自动管理多个小部件的引用指针,这样小部件对象被销毁时不再使用。

类部件{公众:小部件():m_RefCount(1){}无效acquireRef () {m_RefCount + +;}无效releaseRef () {m_RefCount——;如果(m_RefCount = = 0){删除;}}…类WidgetHandle{公众:WidgetHandle () {m_WidgetRef =新的小部件();}WidgetHandle (const WidgetHandle及其它){m_WidgetRef = other.m_WidgetRef;m_WidgetRef - > acquireRef ();}WidgetHandle操作符= (const WidgetHandle及其它){部件* w = other.m_WidgetRef;w - > acquireRef ();m_WidgetRef - > releaseRef (); m_WidgetRef = w; } ~WidgetHandle() { m_WidgetRef->releaseRef(); } private: Widget *m_WidgetRef; };

MATLAB

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

classdefWidgetHandle <处理属性…结束方法……结束结束


有些程序员可能会觉得很奇怪,non-handle对象没有析构函数。由于MATLAB对象破坏总是自动,non-handle对象包含其他对象不需要做任何破坏其他对象。如果一个类代表一些外部资源,必须释放不再需要时,那么一个句柄类应该用于表示该资源,因为它不能被复制在MATLAB和传递价值。

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

我们想要避免使用MATLAB,因为垃圾收集器的复杂性与垃圾收集环境中的管理对象的生命周期。例如,当前的垃圾收集环境放弃析构函数。这意味着他们自动内存管理但不总对象管理。对象频繁使用资源以外的内存,很难实现垃圾收集,可以与不同级别的管理各种资源的稀缺性。另一个缺点是,垃圾收集可以使程序测试和调试更加困难,因为活动发生在垃圾收集不容易重复。

总结

R2008a, MATLAB定义类的对象增加了很多新特性,建立和保存MATLAB的基本素质。当创建MATLAB类,记住是很有用的MATLAB变量和函数的关键特性。这些包括参数和变量通常数组和数组索引支持,所有函数参数显式声明和命名。金宝app处理类析构函数可以表示外部系统或资源。MATLAB处理提供的一些功能的引用和指针在其他语言中,包括自动内存管理,同时避免一些陷阱与指针和垃圾收集。

2008 - 91586 v00出版