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 哪种方式是首

我很难决定在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
哪种方式是首选约定?

在这种情况下没有首选约定。尽管它们看起来很相似,但您的两个示例并不完全相同。这一切都取决于
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