主要内容gydF4y2Ba

的比较gydF4y2BaMATLABgydF4y2Ba和其他面向对象语言gydF4y2Ba

与c++和gydF4y2BaJavagydF4y2Ba代码gydF4y2Ba

MATLABgydF4y2Ba®gydF4y2Ba编程语言不同于其他面向对象语言,如c++或JavagydF4y2Ba®gydF4y2Ba在一些重要的方面。gydF4y2Ba

公共属性gydF4y2Ba

与c++或Java语言中的字段不同,您可以使用MATLAB属性来定义与数据存储实现分离的公共接口。您可以提供对属性的公共访问,因为您可以定义set和get访问方法,这些方法在分配或查询属性值时自动执行。例如,以下语句:gydF4y2Ba

myobj。材料=gydF4y2Ba“塑料”gydF4y2Ba;gydF4y2Ba

分配的gydF4y2Ba字符gydF4y2Ba向量gydF4y2Ba塑料gydF4y2Ba到gydF4y2Ba材料gydF4y2Ba的属性gydF4y2BamyobjgydF4y2Ba.在进行实际分配之前,gydF4y2BamyobjgydF4y2Ba执行一个方法gydF4y2Ba集。材料gydF4y2Ba(假定…的类)gydF4y2BamyobjgydF4y2Ba定义此方法),它可以执行任何必要的操作。看到gydF4y2Ba属性访问方法gydF4y2Ba有关属性访问方法的更多信息。gydF4y2Ba

您还可以通过设置属性来控制对属性的访问,这些属性启用公共、受保护或私有访问。看到gydF4y2Ba属性的属性gydF4y2Ba以获取属性属性的完整列表。gydF4y2Ba

没有隐式参数gydF4y2Ba

在某些语言中,方法的一个对象参数总是隐式的。在MATLAB中,对象是作用于它们的方法的显式参数。gydF4y2Ba

调度gydF4y2Ba

在MATLAB类中,方法调度不像在c++和Java代码中那样基于方法签名。当参数列表包含具有相同优先级的对象时,MATLAB使用最左边的对象来选择要调用的方法。gydF4y2Ba

然而,如果一个实参的类优于其他实参的类,MATLAB会将其分派给较优实参的方法,而不管它在实参列表中的位置如何。gydF4y2Ba

看到gydF4y2Ba类优先gydF4y2Ba为更多的信息。gydF4y2Ba

调用父类方法gydF4y2Ba

  • 在c++中,使用作用域操作符调用超类方法:gydF4y2Ba超类::方法gydF4y2Ba

  • 在Java代码中,你可以使用:gydF4y2Basuperclass.methodgydF4y2Ba

等价的MATLAB运算为gydF4y2Bamethod@superclassgydF4y2Ba.gydF4y2Ba

其他的差异gydF4y2Ba

在MATLAB类中,没有等价于c++模板或Java泛型的东西。然而,MATLAB是弱类型的,它可以编写处理不同类型数据的函数和类。gydF4y2Ba

MATLAB类不支持对相同函数名使用不同签名的重载函数。gydF4y2Ba

对象修改gydF4y2Ba

MATLAB类可以定义公共属性,您可以通过在类的给定实例上显式地为这些属性赋值来修改这些属性。但是,只有类派生自gydF4y2Ba处理gydF4y2Ba类展示引用行为。修改值类(未派生的类)的实例上的属性值gydF4y2Ba处理gydF4y2Ba),只在进行修改的上下文中更改值。gydF4y2Ba

下面的部分将更详细地描述这种行为。gydF4y2Ba

传递给函数的对象gydF4y2Ba

MATLAB通过值传递所有变量。当您将一个对象传递给一个函数时,MATLAB会将调用者的值复制到被调用函数的参数变量中。gydF4y2Ba

然而,MATLAB支持两种类型的类,它们在复制时表现不同:gydF4y2Ba

  • 句柄类——句柄类实例变量引用一个对象。句柄类实例变量的副本引用与原始变量相同的对象。如果函数修改作为输入参数传递的句柄对象,则修改将影响原始句柄和复制句柄引用的对象。gydF4y2Ba

  • 值类——值类实例中的属性数据独立于该实例副本中的属性数据(尽管值类属性可能包含句柄)。函数可以修改作为输入参数传递的值对象,但这种修改不会影响原始对象。gydF4y2Ba

看到gydF4y2Ba句柄类与值类的比较gydF4y2Ba有关这两种类的行为和使用的更多信息。gydF4y2Ba

通过值对象。gydF4y2Ba将值对象传递给函数时,函数会创建实参变量的本地副本。该函数只能修改副本。如果希望修改原始对象,则返回修改后的对象并将其赋值给原始变量名。例如,考虑值类,gydF4y2BaSimpleClassgydF4y2Ba:gydF4y2Ba

classdefgydF4y2BaSimpleClassgydF4y2Ba属性gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Baobj = SimpleClass (c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。颜色= c;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

的实例创建gydF4y2BaSimpleClassgydF4y2Ba,赋值为gydF4y2Ba红色的gydF4y2Ba对其gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

obj = SimpleClass (gydF4y2Ba“红色”gydF4y2Ba);gydF4y2Ba

将对象传递给函数gydF4y2BaggydF4y2Ba,分配gydF4y2Ba蓝色的gydF4y2Ba到gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

函数gydF4y2Bay = g(x) x. color =gydF4y2Ba“蓝”gydF4y2Ba;y = x;gydF4y2Ba结束gydF4y2Ba
y = g (obj);gydF4y2Ba

这个函数gydF4y2BaggydF4y2Ba修改输入对象的副本并返回该副本,但不更改原始对象。gydF4y2Ba

y.ColorgydF4y2Ba
ans =蓝色gydF4y2Ba
obj。Color
ans =红gydF4y2Ba

如果函数gydF4y2BaggydF4y2Ba没有返回值,修改对象gydF4y2Ba颜色gydF4y2Ba属性只会发生在gydF4y2BaobjgydF4y2Ba在函数工作区中。当函数执行结束时,此副本将超出作用域。gydF4y2Ba

重写原始变量实际上是用一个新对象替换它:gydF4y2Ba

obj = g (obj);gydF4y2Ba

经过处理的对象。gydF4y2Ba当将句柄传递给函数时,函数会复制句柄变量,就像传递值对象时一样。但是,由于句柄对象的副本引用与原始句柄相同的对象,因此函数可以修改对象,而不必返回修改后的对象。gydF4y2Ba

例如,假设您修改gydF4y2BaSimpleClassgydF4y2Ba类定义,使类派生自gydF4y2Ba处理gydF4y2Ba类:gydF4y2Ba

classdefgydF4y2BaSimpleHandleClass <处理gydF4y2Ba属性gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Baobj = SimpleHandleClass (c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。颜色= c;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

的实例创建gydF4y2BaSimpleHandleClassgydF4y2Ba,赋值为gydF4y2Ba红色的gydF4y2Ba对其gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

obj = SimpleHandleClass (gydF4y2Ba“红色”gydF4y2Ba);gydF4y2Ba

将对象传递给函数gydF4y2BaggydF4y2Ba,分配gydF4y2Ba蓝色的gydF4y2Ba到gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

y = g (obj);gydF4y2Ba

这个函数gydF4y2BaggydF4y2Ba设置gydF4y2Ba颜色gydF4y2Ba由返回句柄和原始句柄引用的对象的属性:gydF4y2Ba

y.ColorgydF4y2Ba
ans =蓝色gydF4y2Ba
obj。Color
ans =蓝色gydF4y2Ba

的变量gydF4y2BaygydF4y2Ba而且gydF4y2BaobjgydF4y2Ba引用同一个对象:gydF4y2Ba

y.Color =gydF4y2Ba“黄色”gydF4y2Ba;obj。Color
ans =黄色gydF4y2Ba

这个函数gydF4y2BaggydF4y2Ba修改了输入参数(gydF4y2BaobjgydF4y2Ba)并返回该对象的句柄gydF4y2BaygydF4y2Ba.gydF4y2Ba

MATLABgydF4y2Ba按值传递句柄。gydF4y2Ba句柄变量是对对象的引用。MATLAB通过值传递这个引用。gydF4y2Ba

句柄的行为与c++中的引用不同。如果将对象句柄传递给函数,而该函数将另一个对象赋给该句柄变量,则调用方中的变量不受影响。例如,假设您定义了一个函数gydF4y2Bag2gydF4y2Ba:gydF4y2Ba

函数gydF4y2Bay = g2(x) x = SimpleHandleClass(gydF4y2Ba“绿色”gydF4y2Ba);y = x;gydF4y2Ba结束gydF4y2Ba

传递句柄对象gydF4y2Bag2gydF4y2Ba:gydF4y2Ba

obj = SimpleHandleClass (gydF4y2Ba“红色”gydF4y2Ba);y = g2 (obj);y.ColorgydF4y2Ba
ans =绿色gydF4y2Ba
obj。Color
ans =红gydF4y2Ba

该函数覆盖作为参数传入的句柄,但不覆盖句柄引用的对象。原来的处理gydF4y2BaobjgydF4y2Ba仍然引用原始对象。gydF4y2Ba

静态属性gydF4y2Ba

在MATLAB中,类可以定义常量属性,但不能像其他语言(如c++)那样定义“静态”属性。不能从类定义中指定的初始值更改常量属性。gydF4y2Ba

MATLAB有一个长期存在的规则,变量总是优先于函数和类的名称。赋值语句在不存在变量时引入变量。gydF4y2Ba

这种形式的表达式gydF4y2Ba

A.B = CgydF4y2Ba

引入一个新的变量,gydF4y2Ba一个gydF4y2Ba,那是一个gydF4y2Ba结构体gydF4y2Ba包含一个字段gydF4y2BaBgydF4y2Ba的值是gydF4y2BaCgydF4y2Ba.如果gydF4y2BaA.B = CgydF4y2Ba可以引用类的静态属性吗gydF4y2Ba一个gydF4y2Ba类,然后gydF4y2Ba一个gydF4y2Ba会优先于变量吗gydF4y2Ba一个gydF4y2Ba.gydF4y2Ba

这种行为与以前的MATLAB版本有很大的不兼容。例如,引入一个名为gydF4y2Ba一个gydF4y2Ba可以改变赋值语句的含义,比如gydF4y2BaA.B = CgydF4y2Ba在一个gydF4y2Ba.m代码文件。gydF4y2Ba

在其他语言中,类很少使用静态数据,除非是类中的私有数据或公共常量。在MATLAB中,你可以用同样的方法使用常数属性gydF4y2Ba公共gydF4y2Ba最后gydF4y2Ba静态gydF4y2Ba在Java领域。要使用MATLAB中类内部的数据,请在类私有或受保护的方法或局部函数中创建持久变量。gydF4y2Ba

避免MATLAB中的静态数据。如果一个类具有静态数据,那么在多个应用程序中使用同一个类会导致应用程序之间的冲突。在其他一些语言中,冲突不是什么大问题。这些语言将应用程序编译成运行在不同进程中的可执行程序。每个流程都有自己的类静态数据副本。MATLAB,它经常在同一个进程和环境中运行许多不同的应用程序,每个类都有一个副本。gydF4y2Ba

有关在MATLAB中定义和使用静态数据的方法,请参见gydF4y2Ba静态数据gydF4y2Ba.gydF4y2Ba

常见的面向对象技术gydF4y2Ba

这个表提供了到讨论其他面向对象语言通常使用的面向对象技术的部分的链接。gydF4y2Ba

技术gydF4y2Ba 如何在MATLAB中使用gydF4y2Ba
操作符重载gydF4y2Ba 操作符重载gydF4y2Ba
多重继承gydF4y2Ba 子类化多个类gydF4y2Ba
子类化gydF4y2Ba 设计子类构造函数gydF4y2Ba
析构函数gydF4y2Ba 处理类的析构函数gydF4y2Ba
数据成员范围gydF4y2Ba 属性的属性gydF4y2Ba
包(范围类)gydF4y2Ba 包创建名称空间gydF4y2Ba
命名常量gydF4y2Ba 看到gydF4y2Ba用常值定义类属性gydF4y2Ba而且gydF4y2Ba指定值gydF4y2Ba
枚举gydF4y2Ba 定义枚举类gydF4y2Ba
静态方法gydF4y2Ba 静态方法gydF4y2Ba
静态属性gydF4y2Ba

不受支持的。看到gydF4y2Ba持续的gydF4y2Ba变量。相当于JavagydF4y2Ba静态gydF4y2Ba最后gydF4y2Ba或c++gydF4y2Ba静态gydF4y2Ba常量gydF4y2Ba属性,使用gydF4y2Ba常数gydF4y2Ba属性。看到gydF4y2Ba用常值定义类属性gydF4y2Ba

有关可变静态数据,请参见gydF4y2Ba静态数据gydF4y2Ba

构造函数gydF4y2Ba 类的构造函数方法gydF4y2Ba
拷贝构造函数gydF4y2Ba 没有直接等效gydF4y2Ba
参考/引用类gydF4y2Ba 句柄类与值类的比较gydF4y2Ba
抽象类/接口gydF4y2Ba 抽象类和类成员gydF4y2Ba
垃圾收集gydF4y2Ba 对象生命周期gydF4y2Ba
实例属性gydF4y2Ba 动态属性——向实例添加属性gydF4y2Ba
进口类gydF4y2Ba 进口类gydF4y2Ba
事件和监听器gydF4y2Ba 事件和侦听器的概念gydF4y2Ba
Baidu
map