主要内容

类构造函数方法

类构造函数方法的目的

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

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

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

构造函数方法的基本结构

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

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

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

  • 发布初始化 - 执行与子类相关的任何操作,包括引用和分配给对象,调用类方法,将对象传递给函数,依此类推。

这段代码演示了在每个部分中执行的基本操作:

Classdef.ectrumentordesign 属性ComputedValue结束方法函数obj = builductordesign(a,b,c)%%预初始化%任何不使用输出参数的代码(obj)如果输入参数个数= = 0%为超类构造函数提供值%并初始化其他输入a = somedefaultvalue;args {1} = somedefaultValue;args {2} = somedefaultValue;别的当nargin ~= 0时,赋值给单元格数组,%传递给超类构造函数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调用每个超类类的构造函数才能初始化对象。对超类构造函数的隐式调用是没有参数的。如果超类构造函数需要参数,则显式从子类构造函数调用它们。看到构造函数调用的控制序列

在构造函数中初始化对象

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

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

函数obj = MyClass(a,b,c)一个=;...结束

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

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

例如,此构造函数对输入参数进行操作,以赋值价值财产。

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

在构造函数中引用对象

初始化对象时,例如,通过将值分配给属性,请使用输出参数的名称来引用构造函数中的对象。例如,在以下代码中,输出参数是obj.对象是reference asobj.

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

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

没有输入参数构造函数要求

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

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

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

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

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

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

子类的构造函数

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

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

子类构造函数必须在对对象的任何其他引用(obj.).这个限制包括分配属性值或调用普通的类方法。而且,子类构造函数只能调用超类构造函数一次。

仅引用指定的超类

如果是Classdef.没有将类指定为超类,构造函数无法使用此语法调用超类构造函数。也就是说,子类构造函数只能拨打中列出的直接超类构造函数Classdef.线。

Classdef.myclass 
               

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

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

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

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

例如,多维数据集类构造函数调用超类形状构造函数使用默认值多维数据集构造函数被调用,没有参数。如果是多维数据集构造函数用四个输入参数调用,然后通过upvectorViewAngle.到超类构造函数:

Classdef.立方体<形状属性sidelength = 0 color = [0 0 0]结束方法函数cubeobj =立方体(长度,颜色,上升镜,viewangle)%组装超类构造函数参数如果Nargin == 0 super_args{1} = [0 0 1];super_args {2} = 10;elseifNargin == 4 super_args{1} = upvector;super_args {2} = viewangle;别的错误('输入参数错误数量'结束%调用超类构造函数cubeobj @ shoge(super_args {:});%分配属性值(如果提供)如果nargin > 0 cubeObj。SideLength =长度;cubeObj。颜色=颜色;结束...结束...结束结束

零或多个超类参数

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

假设在多维数据集类中的所有属性值形状超类和多维数据集子类具有类定义中指定的默认值。然后你可以创建一个实例多维数据集无需为超类或子类构造函数指定任何参数。

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

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

更多关于子类

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

隐式调用继承构造函数

MATLAB从默认子类构造函数隐式传递参数到超类构造函数。此行为消除了为子类实现的构造方法仅用于将参数传递给超类构造函数。

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

Classdef.BaseClassWithConstr属性CurrentDatedatetime结束方法函数obj = BaseClassWithConstr(dt)CurrentDate = dt;结束结束结束

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

classdef SubclassDefaultConstr < BaseClassWithConstr…结束

对象的对象subclassdefaultconstr.通过使用超类参数调用它的默认构造函数:

obj = SubclassDefaultConstr (datetime);

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

班级构建过程中的错误

对于句柄类,MATLAB调用删除在以下情况下出现错误的方法:

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

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

Matlab致电删除对象上的删除属性中包含的任何物体的方法,以及删除方法用于任何初始化基类。

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

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

输出对象抑制了

类实例的赋值可以取消在调用构造函数时没有赋值输出变量。这种技术对于那些创建图形界面窗口来保存已构造对象的应用程序非常有用。这些应用程序不需要返回对象。

nargout确定是否已用输出参数调用构造函数。例如,类构造函数myapp.类清除对象变量,obj.,如果调用时没有赋值输出:

Classdef.myapp.方法函数obj = myapp....如果Nargout == 0清除obj.结束结束...结束结束

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

相关的话题