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是异构层次结构根类的名称。这意味着默认对象可以是派生于根类的任何类的实例。
Heterogeneous 数组的索引和串联行为遵循 MATLAB 中的大部分常见索引行为,但有一些例外。
以下形式的语句:
a(m:n) = [objm ... objn];
将右边的对象指定给数组元素 (m:n),在左边赋值中指定。
异构数组的索引赋值可以执行以下任一操作:
增大或减小数组的大小。
覆盖现有的数组元素。
更改数组内的对象的属性值。
更改数组的类。
更改数组是否为异构数组。
以下形式的语句:
a = harray(m:n);
将索引 m:n 引用的 harray 的元素指定给数组 a。
异构数组中的索引引用返回原始数组的子范围。根据该子范围 (m:n) 内的特定元素,可能会生成与原始数组不同的类,并且可能不是异构数组。
以下形式的语句:
a = [obj1 obj2 ...];
创建数组 a,该数组包含括号中列出的对象。
串联同一特定类的 Heterogeneous 对象可以保留这些对象的类,不会形成异构数组。
串联派生于同一根超类、但属于不同特定类的 Heterogeneous 对象会生成异构数组。如果所有的类属于同一根层次结构,MATLAB 不会尝试转换任何数组成员的类。
异构数组需要一致的索引和串联行为。因此,matlab.mixin.Heterogeneous 的子类无法更改其默认索引或串联行为。
异构数组中的类无法从以下 mixin 类继承:
matlab.mixin.indexing.RedefinesParenmatlab.mixin.indexing.RedefinesDotmatlab.mixin.indexing.RedefinesBrace
您也无法在子类中重载以下方法:
cathorzcatvertcatsubsrefsubsasgn
在涉及多重继承的情况下,如果您的子类除了从 matlab.mixin.Heterogeneous 继承之外还从超类继承,则超类无法从上述任何 mixin 类中继承,也无法重载上述任何方法。
如果尝试通过不是派生于相同根类的对象形成异构数组,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 Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- 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)