MATLAB构造函数
我很难决定在MATLAB中使用构造函数的最佳方法是什么。 提供的大多数示例如下:MATLAB构造函数,matlab,Matlab,我很难决定在MATLAB中使用构造函数的最佳方法是什么。 提供的大多数示例如下: classdef ClassA < handle properties m_a; m_b; end methods function obj = ClassA(a,b) obj.m_a = a; obj.m_b = b; end end 哪种方式是首
classdef ClassA < handle
properties
m_a;
m_b;
end
methods
function obj = ClassA(a,b)
obj.m_a = a;
obj.m_b = b;
end
end
哪种方式是首选约定?在这种情况下没有首选约定。尽管它们看起来很相似,但您的两个示例并不完全相同。这一切都取决于a
和b
将如何呈现给classA
的构造函数
在第一种情况下:
a
和b
在发送到classA
时必须分别为classB
和classC
在第二种情况下:
a
和b
不是classB/C
的实例,只是classB/C
的构造函数实例化对象所需的典型参数。为了便于论证,我们假设它们属于double类
所以
正如您所看到的,对于classA
,它最终没有什么不同。选择应该更多地取决于调用函数(调用classA
构造函数的函数)必须处理的内容
- 如果调用函数使用
a
和b
作为类classB
和classC
的对象,那么调用函数应该使这些对象已经可用,然后在调用时将其发送给classA
的构造函数。在这种情况下,您将选择第一个选项
- 如果调用函数与
classB
和classC
无关(这些类仅对classA
有用或在classA
内部有用),则调用函数无需处理这些类型。保持a
和b
尽可能简单,只在classA
的构造函数中实例化classB
和classC
,如第二个示例所示
作为旁注,请注意句柄类的一些细节。具体来说,Matlab说:
将属性初始化为唯一值当MATLAB加载类时,MATLAB仅将属性指定给指定的默认值一次
定义。因此,如果使用
处理类构造函数,MATLAB只调用该构造函数一次
每个实例都引用相同的句柄对象。如果你想要一个
要初始化为句柄对象的新实例的属性值
每次创建对象时,在
构造器
这意味着,如果您选择选项2,并且classB/C
也是不需要输入参数的句柄类,不要尝试通过快捷方式来声明它们:
classdef ClassA < handle
properties
m_a = ClassB() ; %// never do that if ClassB is a handle class
m_b = classC() ; %// never do that if ClassC is a handle class
end
methods
function obj = ClassA(a,b)
%// do you other stuff
end
classdef ClassA
相反,在构造函数中初始化变量(如您在示例中所做的那样),而不是在属性定义中。我知道这不是你所做的,但是如果你选择了你的选项2,那么你很容易陷入这个陷阱,去简化事情。
如果执行此操作,将不会显示任何错误,但是您可以在以后的代码中声明/创建的任何其他classB
实例将始终引用在属性定义中第一次创建的同一对象。(即使是classA
的其他实例,其属性也会引用相同的唯一classB
对象。)
case 1: case 2:
variable | type variable | type
a classB a double
b classC b double
then in classA
obj.m_a classB obj.m_a classB
obj.m_b classC obj.m_b classC
classdef ClassA < handle
properties
m_a = ClassB() ; %// never do that if ClassB is a handle class
m_b = classC() ; %// never do that if ClassC is a handle class
end
methods
function obj = ClassA(a,b)
%// do you other stuff
end