技术文章

MATLAB内对象R2008a

DaveFoti数学工作


软件行业自1990年代初以来大有发展,当时MATLAB®面向对象编程特征先开发举例说,使用对象设计模式现为常用隔年 MathWorks开发商深入了解程序员使用对象和需要哪些能力

更新RD2008a面向对象编程能力的一个关键目标是应用其中一些教程,同时坚持MATLAB语言三大核心原理:数组中心和数组索引化、数学函数的重要性以及多命名输入和输出参数的使用

经验丰富的面向对象程序员,文章解释了R2008a中MATLAB设计决策背后的理由,包括MATLAB面向对象特征与其他面向对象语言大相径庭的原因文章特别审查方法和参数、继承、手柄、属性和对象生命周期管理

方法参数

在R2008a中,MATLAB保留方法定义、调用和发送MATLAB前版语义表示对象为作用方法的显性参数与多面向对象语言不同,MATLAB数组或矩阵取中心台万博1manbetx数组没有特殊类型,所有类都支持数组此外,由于MATLAB方法常常需要对多对象采取行动,多对象参数对称在MATLAB代码中更重要举例说,MATLAB加加用

函数显示C++

方法内A、B和C全部变量都可提供适合上下文的名称并用作变量用于数学方程归根结底,方法简单函数对对象作用方法唯一独有特征是它们能访问类内部定义(受保护和私有定义)。MATLAB方法没有隐式参数

为何MATLAB内没有隐式对象

在某些语言中,单对象参数向方法总隐含使用这种语言时,方法总对单标量对象操作而无需访问对象数组元素考虑MATLAB方法对对象数组作用

函数显示S=Sum(X)S=0;Fork = 1:Longe(X)S = S+X(k).value结束结束

语言隐式对象参数提供关键字访问隐式对象,但通常不要求您通过此访问属性如果MATLAB隐含属性,数组对象逻辑扩展即索引化为零

S=S+k.value

继承权

在RD2008a中,MATLAB引入新继承模式,基础思想是类定义有常见特征和行为对象集子类定义显示超类定义特征和行为对象子集和超类所有实例未显示的额外特征和行为R2008a前MATLAB对象使用struct系统数组高可见度并居于从其他类继承类方式的中心对象子类struct系统内含字段供每个超级类使用,该字段内含属于超级类对象

这种方法在许多方面简单优雅举例说,使用不使用特殊语法超类构造器构建子类实例很容易,从子类方法调出超类方法很容易-你简单调出子类超类对象超类方法然而,这种继承模式有问题

R-2008a前继承模型的一个缺陷是,从子类方法中调用超级方法只能通过传递对象超级类组件表示超类法不接收全对象,超类法调用不发送子类

新的继承模式通过从字义上将每个对象都视为不可分割的整体来解决这一问题,而不论底层实施细节如何。调用超级类方法使用语法避免实例属于超级类而非子类在新模型中,子类实例拥有超类所有属性和方法,子类对象不是超类组件合成物(图1)。

matlab_objects_fig1_w.gif
图1子类对象比较MATLAB子类定义子对象子类中每个对象为超级类成员,但有超出超级类定义的额外特征R2008a前子类实例包含实超类实例,可用以引用超级类方法万博1manbetx在R2008a中,使用类def定义类的例子不包含超级类实例,相反支持在整个子类实例中调用超级类方法的能力以这种方式,对象在整个操作中保持单一特征点击图像查看放大视图

句柄处理

MATLAB定义控件类表示对象特性独立于属性值和人或事物一样,处理对象可以改变状态而不失去身份handles往往表示像窗口或文件等有形事物,而不是概念或数学实体像数字(图2)。用于创建某些类型数据结构例例树节点可以是控件对象每一节点基于树上位置而有独有特征,但与节点相关联的数据可随时间变化

matlab_objects_fig2_w.gif
图2对象优选控柄左上角顺时针:文件夹或文件、树形数据结构节点、窗口和个体成员点击图像查看放大视图

自MATLAB4以来,手柄用Handle图形提供®.handles提供访问对象表示数字、轴线和其他视觉元素

与数字不同,每个图形元素表示唯一视觉显示器单行显示特殊样式数据块可修改行样式而不创建新样式,因为它的句柄识别它行控件可传递函数而不复制对象并创建第二行,允许写函数操作现有控件并在不同背景中用不同控件使用

R2008a允许你自创控件类当您想创建新类型对象代表唯一物理实体或抽象数据结构时,此功能是有用的

属性

MATLAB类定义除方法外可包含属性属性优先使用MATLAB类访问存储对象数据面向对象编程的一个关键目标就是隐藏类内部操作这种方法允许类实现演化而不强制代价高昂的修改使用类代码为了避免这些变化,C++或JavaTM等语言程序员学习保持数据成员隐私并提供公共访问方法,即使这些方法只是分配或返回个人数据成员

如果MATLAB采取类似方法,C++和Ja万博1manbetxMATLAB支持复杂数组索引操作,这些操作无法轻易使用方法调用举例说,用字段符号比较简单直接分配

x.Data(1:2:+1:2+)y

更多复杂访问方法使用

time=x.getDatatom(1:2:end,1:2:end)=yx.setData(temp);

某些语言除字段外提供属性概念属性使用相同的语法访问和分配字段,但允许类定义属性访问或分配时的额外行为MATLAB中的属性可以像字段一样简单-只是存储值存取方法稍后可添加而不改变对象数据存取方式没有理由区分字段属性,所以MATLAB类def刚有属性

对象生命周期管理

万博1manbetxMATLAB执行目标生命周期管理策略,支持反射器并一旦从任何MATLAB工作空间无法接触即销毁对象MATLAB语言总是管理存储器分配,当函数退出时摧毁工作空间变量,或出错或回归正常调用上下文我们想保留简单模型,但也想扩展它以处理可能持续超出函数的物体(即返回调用函数或存储到某些其他对象返回调用函数)。

MATLAB控件类可定义删除法,该法行为非常像C++语言中的毁灭器(图3a和3b)。MATLAB中,删除法调用正前对象销毁,因为对象无法再从任何MATLAB变量访问删除方法可用于关闭文件、关闭外部程序或通知需对销毁第一个对象作出反应的另一对象由句柄类定义,只有处理类MATLAB有摧毁器这是因为MATLAB使用句柄类表示有独特特性的有形对象和对象概念对象永不停止存在-例如5号并不存在,因为它不再保留在一个变量内

C++

图3aC++代码打包类部件手势提供基于栈对象可自动管理多引用元件指针,以便在元件对象停止使用时销毁

类元件{公共:Witects/RefCount/l{{{}无效获取Ref/{m_RefCount+++无效释放Refs/m_RefCount-m_RefCount=0){删除此}}.类部件{公开:部件{m_部件Ref=新部件{wjectHandle/bjectRefm_WidgetRef->acquireRef()!wjectHandrator=(constWittHandle+Other){*w=Other.m_WartetRefw->acquireRef()!m_WidgetRef->releaseRef()!m#元件Ref=wwhitshandle {m_shitRef>refRefre私有式#m_元件Ref};

MATLAB

图3b等效MATLAB类MATLAB实现使用一类,因为柄超级类执行当柄停止使用时自动销毁

类def部件手柄属性结束方法.结束结束


某些程序员可能发现非手式对象没有损耗器很奇怪MATLAB对象销毁总是自动化的,持有其他对象的非手式对象不需要做任何事情来销毁这些其他对象如果类表示某些外部资源,当不再需要时必须发布,则手柄类应使用表示资源,因为它无法在MATLAB中真正复制传值

为何不使用MATLAB垃圾回收器

MATLAB避免使用垃圾回收器,因为在垃圾回收环境管理对象生命周期的复杂性举例说,当前垃圾回收环境放弃毁灭器表示内存管理自动化,但不完全对象管理对象常使用除存储器以外的资源,很难实施垃圾回收管理各种资源,而资源稀疏程度不一。另一劣势是垃圾回收可增加程序测试调试难度

摘要

在R2008a中,MATLAB添加了许多新特征来定义基于并维护MATLAB基本特性的物体类创建 MATLAB类时,应记住MATLAB变量和函数的关键特征万博1manbetx其中包括参数和变量常数组支持数组索引化,所有函数参数均明确声明并命名处理级与损耗器可表示外部系统或资源MATLAB手柄提供一些用其他语言引用和指针的能力,包括自动内存管理,同时避免与指针和垃圾收集相关的某些陷阱

发布2008-91586v