文档

类构造方法

类构造函数方法的目的

构造函数方法是创建类实例的特殊函数。通常,构造函数方法接受输入参数来分配存储在属性中的数据并返回一个初始化的对象。

有关基本示例,请参见创建一个简单类

所有MATLAB®类有一个默认构造函数方法。此方法返回创建时不带输入参数的类的对象。类可以定义覆盖默认构造函数的构造函数方法。显式定义的构造函数可以接受输入参数,初始化属性值,调用其他方法,并执行创建类对象所需的其他操作。

构造函数方法的基本结构

构造函数方法可以构造为三个基本部分:

  • 预初始化——计算超类构造函数的参数。

  • 对象初始化——调用超类构造函数。

  • 后初始化——执行与子类相关的任何操作,包括引用和赋值对象、调用类方法、将对象传递给函数等等。

这段代码说明了在每个部分执行的基本操作:

classdef< BaseClass1属性ComputedValue结束方法函数obj = ConstructorDesign(a,b,c)预初始化%%%任何代码没有使用输出参数(obj)如果Nargin == 0为超类构造函数提供值%并初始化其他输入a = someDefaultValue;args{1} = someDefaultValue;args{2} = someDefaultValue;其他的当nargin ~= 0时,分配给单元格数组,%,传递给supclass构造函数Args {1} = b;Args {2} = c;结束compvalue = myClass.staticMethod(a);对象初始化%%在访问对象之前调用超类构造函数你不能限制这句话obj = obj@BaseClass1(args{:});%%初始化后%%任何代码,包括对对象的访问obj.classMethod (arg);obj。ComputedValue = compvalue;...结束...结束...结束

像调用任何函数一样调用构造函数,传递参数并返回类的对象。

obj = ConstructorDesign(a,b,c);

建造商指引

  • 构造函数与类具有相同的名称。

  • 构造函数可以返回多个参数,但第一个输出必须是创建的对象。

  • 如果不想分配输出参数,可以在构造函数中清除对象变量(参见输出对象被抑制).

  • 如果创建类构造函数,请确保可以在没有输入参数的情况下调用它。看到无输入参数构造函数要求

  • 如果构造函数显式调用超类构造函数,则此调用必须发生在对所构造对象的任何其他引用之前,而不能发生在返回声明。

  • 对超类构造函数的调用不能是有条件的。不能在循环、条件、开关、try/catch或嵌套函数中放置超类构造调用。看到没有对超类构造函数的条件调用获取更多信息。

默认构造函数

如果一个类没有定义构造函数,MATLAB提供一个默认构造函数,该构造函数不接受参数,并返回一个属性初始化为属性默认值的标量对象。MATLAB提供的默认构造函数也调用所有不带参数的超类构造函数,或将任何参数传递给默认子类构造函数。

当子类没有定义构造函数时,默认构造函数将其输入传递给直接超类构造函数。当不需要子类定义构造函数,但超类构造函数需要输入参数时,此行为非常有用。

何时定义构造函数

定义一个构造函数方法来执行默认构造函数不能执行的对象初始化。例如,当创建类的对象时,需要:

  • 输入参数

  • 初始化类的每个实例的对象状态,例如属性值

  • 使用由子类构造函数确定的值调用父类构造函数

相关信息

有关构造枚举的特定信息,请参见枚举类构造函数调用序列

有关在构造函数中创建对象数组的信息,请参见构造对象数组

如果创建的类是子类,MATLAB调用每个超类的构造函数来初始化对象。对超类构造函数的隐式调用不带参数。如果父类构造函数需要参数,则从子类构造函数显式调用它们。看到构造函数调用的控制序列

在构造函数中初始化对象

构造函数方法返回一个初始化的对象作为输出参数。在执行构造函数时,在执行第一行代码之前创建output参数。

例如,下面的构造函数可以为对象的属性赋值一个作为第一个语句,因为对象obj已分配给的实例MyClass

函数obj = MyClass(a,b,c) obj。A = A;...结束

您可以从构造函数调用其他类方法,因为对象已经初始化。

构造函数还创建了一个对象,该对象的属性有其默认值——empty ([])或属性定义块中指定的默认值。

类的值,此构造函数对输入参数进行操作价值财产。

函数obj = MyClass(a,b,c) obj。值= (a + b) / c;...结束

在构造函数中引用对象

例如,在初始化对象时,通过为属性赋值,使用输出参数的名称在构造函数中引用对象。例如,在下面的代码中,输出参数为obj对象是reference asobj

% obj是正在构造的对象函数obj = MyClass(arg) obj。Propert1 = arg*10;obj.method1;...结束

有关定义默认属性值的详细信息,请参见属性默认值

无输入参数构造函数要求

在某些情况下,构造函数必须能够在没有输入参数的情况下被调用:

  • 当将对象加载到工作区中时,如果类ConstructOnLoad属性设置为真正的,负载函数调用不带参数的类构造函数。

  • 当创建或展开一个对象数组,使得不是所有元素都有特定的值时,调用类构造函数时不带参数来填充未指定的元素(例如,x(10,1) = MyClass(a,b,c);).在这种情况下,构造函数只被调用一次,不带参数来填充空数组元素(x (1:9, 1))与此对象的副本。

如果没有输入参数,构造函数只使用默认属性值创建对象。一个好的做法是在类构造函数中添加一个零参数检查,以防止出现以下两种情况之一时出现错误:

函数obj = MyClass(a,b,c)如果Nargin > 0 obj。A = A;obj。B = B;obj.C = c;...结束结束

有关处理超类构造函数的方法,请参见构造函数方法的基本结构

子类的构造函数

子类构造函数可以显式调用超类构造函数来将参数传递给超类构造函数。子类构造函数必须在对超类构造函数的调用中指定这些参数,并且必须使用构造函数输出参数来形成调用。语法如下:

classdefMyClass <超类方法函数obj = MyClass(a,b,c,d) obj@SuperClass(a,b);...结束结束结束

子类构造函数必须在其他对象引用之前调用父类构造函数(obj).这种限制包括分配属性值或调用普通类方法。同样,子类构造函数只能调用父类构造函数一次。

只引用指定的超类

如果classdef没有将类指定为超类,构造函数就不能使用此语法调用超类构造函数。类中列出的直接超类构造函数,即子类构造函数只能调用classdef线。

classdefMyClass < SuperClass1 & SuperClass2

类中指定的从左到右的顺序,MATLAB调用任何未调用的构造函数classdef线。MATLAB在这些调用中不传递参数。

没有对超类构造函数的条件调用

对超类构造函数的调用必须是无条件的。对于一个给定的超类只能有一个调用。通过在使用对象之前调用超类构造函数来初始化对象的超类部分(例如,为属性值赋值或调用类方法)。

要调用具有依赖于某些条件的不同参数的超类构造函数,请构建一个参数单元格数组并提供对构造函数的一次调用。

例如,多维数据集类构造函数调用超类形状构造函数时使用默认值多维数据集构造函数调用时不带参数。如果多维数据集构造函数调用时带有四个输入参数,然后传递upvector而且viewangle对超类构造函数:

classdef立方体<形状属性SideLength = 0 Color = [0 0 0]结束方法函数cubeObj =立方体(长度,颜色,上矢量,视角)组装超类构造函数参数如果Nargin == 0 super_args{1} = [0 0 1];超级参数{2}= 10;elseifNargin == 4 super_args{1} = upvector;Super_args {2} = viewangle;其他的错误(输入参数数量错误结束调用超类构造函数cubeObj@Shape (super_args {:});如果提供,分配属性值如果nargin > 0 cubeObj。SideLength =长度;cubeObj。颜色=颜色;结束...结束...结束结束

零或多个超类参数

若要支金宝app持不带参数调用超类构造函数的语法,请显式提供此语法。

假设在的情况下多维数据集类中的所有属性值形状超类和多维数据集子类具有在类定义中指定的默认值。的实例多维数据集无需为父类或子类构造函数指定任何参数。

方法中实现此行为的方法如下多维数据集构造函数:

方法函数cubeObj =立方体(长度,颜色,上矢量,视角)组装超类构造函数参数如果Nargin == 0 super_args = {};elseifNargin == 4 super_args{1} = upvector;Super_args {2} = viewangle;其他的错误(输入参数数量错误结束调用超类构造函数cubeObj@Shape (super_args {:});如果提供,分配属性值如果nargin > 0 cubeObj。SideLength =长度;cubeObj。颜色=颜色;结束...结束结束

更多关于子类

看到设计子类构造函数有关创建子类的信息。

对继承构造函数的隐式调用

MATLAB将参数从默认子类构造函数隐式传递给父类构造函数。这种行为消除了为子类实现构造函数方法只为将参数传递给超类构造函数的需要。

例如,下面的类构造函数需要一个输入参数(adatetime对象),构造函数将其赋给CurrentDate财产。

classdefBaseClassWithConstr属性CurrentDate datetime结束方法函数obj = BaseClassWithConstr(dt) obj。CurrentDate = dt;结束结束结束

的子类BaseClassWithConstr,但您的子类不需要显式构造函数方法。

< BaseClassWithConstr…结束

属性的对象SubclassDefaultConstr通过使用超类实参调用其默认构造函数:

obj = SubclassDefaultConstr(datetime);

有关子类构造函数的信息,请参见子类的构造函数而且默认构造函数

课堂建设中的错误

对于句柄类,MATLAB调用删除在以下条件下发生错误时,方法:

  • 对对象的引用出现在错误发生之前的代码中。

  • 一个早期返回语句出现在错误之前的代码中。

MATLAB调用删除方法,则删除属性中包含的任何对象的方法,以及删除任何初始化基类的方法。

根据错误发生的时间,MATLAB可以在对象完全构造之前调用类析构函数。因此类删除方法必须能够操作部分构造的对象,这些对象可能没有所有属性的值。有关更多信息,请参见金宝app支持销毁部分构造的对象

有关如何销毁对象的信息,请参见句柄类析构函数

输出对象被抑制

类实例的赋值可以禁止在对构造函数的调用中没有分配输出变量时,使用。这种技术对于创建图形界面窗口的应用程序非常有用。这些应用程序不需要返回对象。

使用nargout以确定是否已使用输出参数调用构造函数。类的类构造函数MyApp类清除对象变量,obj,如果调用时没有指定输出:

classdefMyApp方法函数obj = MyApp...如果Nargout == 0清除obj结束结束...结束结束

类构造函数不返回对象时,MATLAB不会触发meta.classInstanceCreated事件。

相关的话题