主要内容

串联不同类的对象

基础知识

本节所提供的材料建立在对以下各节所提供信息的理解之上。

马铃薯草贴级规则

马铃薯草®遵循这些串联对象的规则:

  • MATLAB总是试图将所有对象转换为主导类。

  • 用户定义的类优先于内置类双倍的

  • 如果任何两个对象之间没有定义的优势关系,那么最左边的对象占主导地位(见课程优先级)。

当在连接或下标赋值期间转换为主导类时,MATLAB搜索非主导类以寻找与主导类同名的转换方法。如果存在这样的转换方法,MATLAB调用它。如果转换方法不存在,MATLAB就调用非主导对象上的主导类构造函数。

占主导地位可以定义霍罗斯克vertcat, 或者修改默认串联过程的方法。

笔记

MATLAB不会将对象转换为公共超类,除非这些对象是异构层次结构的一部分。有关更多信息,请参见设计异构类层次结构

连接对象

连接将物体与数组结合在一起。例如:

ary = [obj1,obj2,obj3];

的大小ar是1-by-3。

阵列的类与正在连接的对象的类相同。如果MATLAB可以将对象转换为主导类,则可以串联不同类的对象。MATLAB尝试转换不同的对象:

  • 呼叫下级对象转换器方法,如果存在。

  • 将下级对象传递给主导类构造函数以创建主导类的对象。

如果劣质对象的转换成功,则Matlab返回占主导地位的数组。如果无法进行转换,MATLAB返回错误。

致电主导类构造函数

MATLAB调用主类构造函数,将从属类的对象转换为主类。MATLAB将次对象作为参数传递给构造函数。如果类设计允许主类构造函数接受低级类的对象作为输入参数,那么无需实现单独的转换器方法就可以进行连接。

如果构造函数只需将此参数分配给属性,则结果是主导类的对象,其对象存储在属性中。如果此赋值不是所需的结果,则确保类构造函数包括充足的错误检查。

例如,考虑类ColorClass和两个子类,RGBColor.HSVColor

Classdef.ColorClass属性颜色结尾结尾

RGBColor.继承了颜色财产ColorClassRGBColor.将定义为红色,绿色和蓝色(RGB)值的三元素向量的颜色值存储。构造函数不限制输入参数的值。它直接分配此值颜色财产。

Classdef.RGBCOLOR 方法函数obj = rgbcolor(RGB)如果Nargin > 0 obj。颜色= rgb;结尾结尾结尾结尾

HSVColor也继承了颜色财产ColorClassHSVColor将定义为色调,饱和度,亮度值(HSV)值的三元素矢量的颜色值存储。

Classdef.hsvcolor 方法函数obj = HSVColor (hsv)如果nargin> 0 obj.color = HSV;结尾结尾结尾结尾

创建每个类的实例并将它们连接到一个数组中。这RGBColor.Object是显性对象,因为它是最左边的对象,而且两个类都没有定义显性关系:

crgb = RGBColor([1 0 0]);chsv = HSVColor([0 1 1]);必要= [crgb, chsv];类(必要)
ans = rgbcolor.

您可以将这些对象组合成一个数组,因为MATLAB可以传递类的次对象HSVColor到主导类的构造函数。但是,请注意颜色第二个财产RGBColor.对象实际上包含HSVColor对象,而不是一个RGB.颜色规格:

必要(2)。颜色
ANS = HSVColor具有属性:颜色:[0 1 1]

避免这种不受欢迎的行为:

  • 实现转换器方法

  • 在将值赋给属性之前,在类构造函数中执行参数检查

转换器的方法

如果您的类设计需要对象转换,请为此目的实现转换器方法。

ColorClass类定义了转换器方法RGBColor.HSVColor对象:

Classdef.ColorClass属性颜色结尾方法函数rgbobj = rgbcolor(obj)如果isa(obj,'hsvcolor') rgbObj = RGBColor(hsv2rgb(obj.Color));结尾结尾函数hsvobj = hsvcolor(obj)如果isa(obj,“RGBColor”)hsvobj = hsvcolor(rgb2hsv(obj.color));结尾结尾结尾结尾

创建一个数组RGBColor.HSVColor带有修改后的超类的对象:

crgb = RGBColor([1 0 0]);chsv = HSVColor([0 1 1]);必要= [crgb, chsv];类(必要)
ans = rgbcolor.

MATLAB调用转换器方法HSVColor它来自超类的对象。第二个阵列元素现在是一个RGBColor.具有RGB颜色规范的对象分配给颜色属性:

ary(2)
ans = RGBColor with properties: Color: [1 0 0]
必要(2)。颜色
ans = 1 0 0

如果最左边的对象是类HSVColor,阵列ar也是一流的HSVColor,Matlab转换了颜色属性数据为HSV颜色规范。

Ary = [chsv crgb]
ARY = 1x2 HSVCOLOR属性:颜色
必要(2)。颜色
Ans = 0 1 1

在超类中定义转换器方法并在子类构造函数中添加更好的参数检查,产生更可预测的结果。这里是RGBColor.具有参数检查的类构造函数:

Classdef.RGBCOLOR 方法函数obj = rgbcolor(RGB)如果Nargin == 0 RGB = [0 0 0];别的如果~ (isa (rgb,'双倍的'的)......&& size(rgb,2)== 3......&& max(rgb)<= 1 && min(rgb)> = 0)错误(“将颜色指定为RGB值”的)结尾结尾OBJ.COLOR = RGB;结尾结尾结尾

您的应用程序可能需要额外的错误检查和其他编码技术。这些示例中的类仅用于展示概念。

相关的话题