matlab.mixin.Heterogeneous 类
命名空间: matlab.mixin
异构数组构造的超类
描述
matlab.mixin.Heterogeneous
是支持形成异构数组的抽象类。异构数组是具有不同特定类的对象数组,但都派生于根类或是根类的实例。根类直接派生于 matlab.mixin.Heterogeneous
。
方法
受保护方法
matlab.mixin.Heterogeneous.getDefaultScalarElement | 返回异构数组运算的默认对象 |
详细信息
异构层次结构
使用 matlab.mixin.Heterogeneous
定义可以将其实例组合到异构数组中的类的层次结构。
通过以下类定义可以构造组合派生于 HierarchyRoot
的任何类实例的异构数组。
classdef HierarchyRoot < matlab.mixin.Heterogeneous % HierarchyRoot is a direct subclass of matlab.mixin.Heterogeneous. % HierarchyRoot is the root of this heterogeneous hierarchy. end
通过直接从 matlab.mixin.Heterogeneous
派生 HierarchyRoot
类,HierarchyRoot
类可以变为类层次结构的根。可以将该层次结构的成员实例组合到异构数组。只能组合从相同根类派生的类的实例以形成有效的异构数组。
异构数组类
异构数组类始终都是对数组中的所有对象共用的最具体超类的类。例如,假定您定义以下类层次结构:
通过 LeafB
的实例形成包含 LeafA
的实例的数组,以创建 Middle
类的数组。
harray = [LeafA LeafB]; class(harray)
ans = Middle
通过 LeafD
的实例形成包含 LeafC
的实例的数组,以创建 HierarchyRoot
类的数组。
harray = [LeafC LeafD]; class(harray)
ans = HierarchyRoot
通过 LeafA
的另一个实例形成包含 LeafA
的实例的数组,以创建 LeafA
类的同构数组。
harray = [LeafA LeafA]; class(harray)
ans = LeafA
您只能使用从相同层次结构根(例如,前面显示的层次结构中的 HierarchyRoot
类)派生的对象构成异构数组。
您可以使用从多个超类派生的对象构成异构数组,但层次结构中只有一个分支可以定义一个异构根。
异构数组是多个运算的结果,即生成包含异构层次结构中的两个或更多个类的实例的数组。通常,运算是对赋值进行串联或索引。例如,以下语句使用索引赋值形成异构数组。
harray(1) = LeafA; harray(2) = LeafC; class(harray)
ans = Middle
如果数组包含从 matlab.mixin.Heterogeneous
派生的对象,则对其赋予新对象可以更改该数组的类。例如,假设同构数组仅包含 LeafA
类的对象。
harray = [LeafA,LeafA,LeafA]; class(harray)
ans = LeafA
将派生于相同根的不同类的对象添加到同构数组会将该数组的类转换为最具体的超类。
harray(4) = LeafB; class(harray)
ans = Middle
方法调度
MATLAB® 调用其主导参量是异构数组的方法时:
该方法必须是为异构数组的类定义的,即直接由数组的类定义或通过从超类继承定义。
该方法必须为
Sealed = true
(即,不能被子类覆盖)。如果您需要密封继承的方法,请参阅“密封继承的方法”。
与同构数组一样,异构数组的类决定对任何指定的方法调用执行哪种类方法。MATLAB 在调度方法时不考虑数组中单个元素的类。
要求对异构数组调用的方法为 Sealed = true
,从而确保所有数组元素的行为正确并且可预测。
如果从异构层次结构以外继承的方法不是 Sealed = true
,则必须覆盖这些方法,并且您需要对异构数组调用这些方法。
例如,假设除了 matlab.mixin.Heterogeneous
,您还通过创建 matlab.mixin.SetGet
的子类定义了一个异构数组。覆盖 set
方法以按照类设计要求调用 matlab.mixin.SetGet
超类方法。
classdef HeterogeneousSetGet < matlab.mixin.SetGet & matlab.mixin.Heterogeneous properties P end methods(Sealed) function varargout = set(obj,varargin) [varargout{1:nargout}] = set@matlab.mixin.SetGet(obj,varargin{:}); end end end
方法实施可以利用这样的事实,即给定异构数组 harray
和标量索引 n
,表达式
harray(n)
不是异构数组。因此,对异构数组的单个元素调用方法时,对异构数组的特殊要求并不适用。
定义默认对象
可以使用缺失数组元素创建 MATLAB 中的异构数组。例如:
通过索引赋值创建一个带空缺的数组。例如,如果之前未定义
harray
:harray(5) = LeafA;
正在从 MAT 文件加载异构数组,但 MATLAB 找不到特定对象的类定义。
在这种情况下,matlab.mixin.Heterogeneous
类调用方法 getDefaultScalarElement
来创建默认对象以填充空缺。此方法返回根类的一个实例,它是异构层次结构中 matlab.mixin.Heterogeneous
的直接子类。
当根类是抽象类或不是异构层次结构中的类的合适默认对象时,可以覆盖 getDefaultScalarElement
方法以返回派生于根类的类的实例。
getDefaultScalarElement
方法通过覆盖异构层次结构的根类中名为 getDefaultScalarElement
的 matlab.mixin.Heterogeneous
方法,指定默认对象的类。只能覆盖根类中的 getDefaultScalarElement
。
getDefaultScalarElement
方法具有以下签名:
methods (Static,Sealed,Access = protected) function defaultObject = getDefaultScalarElement ... end end
getDefaultScalarElement
方法必须满足以下条件:
静态 - MATLAB 调用此方法而不带任何对象。
受保护 - MATLAB 调用此方法,没有对象用户。
密封(非必需)- 密封此方法以确保异构层次结构的用户不会更改类的预期行为。
它必须返回标量对象
它的返回值必须传递根类的
isa
测试,即(isa(getDefaultScalarElement,'HierarchyRoot')
其中,
HierarchyRoot
是异构层次结构根类的名称。这意味着默认对象可以是派生于根类的任何类的实例。
不能重新定义索引或串联
异构数组需要一致的索引和串联行为。因此,matlab.mixin.Heterogeneous
的子类不能更改其默认的索引引用、索引赋值或串联行为。
不能在子类中覆盖以下方法:
cat
horzcat
vertcat
subsref
subsasgn
如果涉及多种继承,即除了 matlab.mixin.Heterogeneous
,子类还继承超类,则超类不能定义这些方法中的任何一个方法。
以下形式的语句:
a = [obj1 obj2 ...];
创建数组 a
,该数组包含括号中列出的对象。
串联同一特定类的 Heterogeneous
对象可以保留这些对象的类,不会形成异构数组。
串联派生于同一根超类、但属于不同特定类的 Heterogeneous
对象会生成异构数组。如果所有的类属于同一根层次结构,MATLAB 不会尝试转换任何数组成员的类。
以下形式的语句:
a(m:n) = [objm ... objn];
将右边的对象指定给数组元素 (m:n
),在左边赋值中指定。
异构数组的索引赋值可以执行以下任一操作:
增大或减小数组的大小。
覆盖现有的数组元素。
更改数组内的对象的属性值。
更改数组的类。
更改数组是否为异构数组。
以下形式的语句:
a = harray(m:n);
将索引 m:n
引用的 harray
的元素指定给数组 a
。
异构数组中的索引引用返回原始数组的子范围。根据该子范围 (m:n
) 内的特定元素,可能会生成与原始数组不同的类,并且可能不是异构数组。
转换非成员对象
如果尝试通过不是派生于相同根类的对象形成异构数组,MATLAB 调用 convertObject
方法(如果存在)以将对象转换为主导类。通过实施 convertObject
方法,可以构造包含不属于同一个异构层次结构的对象的异构数组。
假定有两个类 A
和 B
,其中 B
不是派生于 matlab.mixin.Heterogeneous
,或 A
和 B
是从派生于 matlab.mixin.Heterogeneous
的不同根类派生的。
MATLAB 在以下情况下尝试调用 A
的根类所实现的 convertObject
方法:
索引赋值
A(k) = B
水平和垂直串联
[A B] and [A;B]
[A,B] and [A;B]
如果要支持其类不是在异构层次结构中定义的对象转换,请实施 convertObject
方法。如果类设计不要求这种转换,则无需实施该方法。
只有异构层次结构的根类才能实现 convertObject
方法。
convertObject
方法必须具有以下签名。
methods (Static, Sealed, Access = protected) function cobj = convertObject(DomClass,objToConvert) ... end end
其中,对于索引赋值 A(k) = B
和串联 [A B]
:
DomClass
是数组A
的类的名称。objToConvert
是要转换的对象,在本例中为B
。cobj
是A
所属的异构层次结构的合法成员。
如果 convertObject
返回的对象不在类 A
所属的层次结构中,则 MATLAB 会引发错误。
句柄兼容性
matlab.mixin.Heterogeneous
类与句柄兼容。使用多个超类定义子类时,该类可以和句柄或值类结合使用。有关句柄兼容性的信息,请参阅Handle Compatible Classes。
matlab.mixin.Heterogeneous
类是值类。要了解值类如何影响复制操作,请参阅 MATLAB 编程基础文档中的复制对象。
版本历史记录
在 R2011a 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)