【问题标题】:Multiple class constructor Matlab多类构造函数 Matlab
【发布时间】:2012-04-20 22:16:44
【问题描述】:

是否可以在 Matlab 中定义多个类构造函数?如果是,怎么做?

【问题讨论】:

    标签: oop matlab


    【解决方案1】:

    每个类都有一个构造函数。但是...构造函数可以接受任意数量和类型的参数,包括基于varargin 的参数。

    因此,要在 Java 中提供默认第三个参数的选项,您可以编写如下内容(基于 java documentation 的示例):

    public Bicycle(int startCadence, int startSpeed, int startGear) {
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;
    }
    public Bicycle(int startCadence, int startSpeed) {
        gear = 1;
        cadence = startCadence;
        speed = startSpeed;
    }
    

    在 Matlab 中你可以写

    classdef Bicycle < handle
        properties (Access=public)
            gear
            cadence
            speed
        end
        methods (Access = public)
            function self = Bicycle(varargin)
                if nargin>2
                    self.gear = varargin{3};
                else
                    self.gear = 1;
                end
                self.cadence = varargin{1};
                self.speed = varargin{2};
            end
        end
    end
    

    【讨论】:

    • 请注意,您不能在 if 语句中创建“self”,因此第一次将任何内容分配给“self”时,必须在 if 子句之前或之后。
    • 最终得到了这个解决方案 :) tnx!
    • 我已经更新了代码示例并重新测试了它,基于来自低代表用户的(正确被拒绝)编辑。还添加了足够的样板来生成一个完整的文件,该文件应命名为“Bicycle.m”。在 R2016b 中测试。
    【解决方案2】:

    每个类只有一个构造函数,每个.m文件只能包含一个类定义。

    如果您希望类根据输入略有不同,您可以使用定义类方法可识别的开关的属性。如果您想根据输入有非常不同的类,您可以创建一个generateClass-函数,该函数将调用不同文件中定义的一个或另一个类。当然,如果这些不同的类有很多共同的方法和属性,您可以将它们创建为共同超类的子类。

    【讨论】:

    • 好帖子。 . .但请注意原始海报:继承要非常小心。它给了你很多绳子让你上吊。如果您只想拥有一个默认构造函数和其他可以初始化变量的构造函数,请不要使用它。使用 varargin 获得此功能。
    • 同一个类,只是初始化的过程不同。我想我将以这两种方式传递构建实例所需的所有参数,以及一个定义构建方式的参数。肮脏但很快.. 可悲的是,我的解决方案变得如此容易理解.. 你的 matlab 真丢脸!
    • @bsmca:您始终可以定义(静态)方法来实现两种不同的构建方式,然后从公共构造函数中调用它们中的任何一个。只要确保你只在之前或之后创建对象,而不是在这些方法中。
    • 在 MATLAB 中,如果构造函数需要很大的灵活性,我经常发现自己使用静态工厂方法模式或两阶段初始化模式。
    【解决方案3】:

    Pursuit 的答案有效,但不熟悉该函数的用户看不到需要多少参数或它们的用途。我会推荐这个:

    methods (Access = public)
        function self = Bicycle(startCadence, startSpeed, startGear)
            if nargin>2
                self.gear = startGear;
            else
                self.gear = 1;
            end
            self.cadence = startCadence;
            self.speed = startSpeed;        
        end
    end
    

    如果您现在键入“Bicycle(”并等待,您至少可以看到三个参数。但没有显示第二种可能性。这似乎是可能的(例如用于情节)但我不知道该怎么做。

    【讨论】:

    • 这对你真的有用吗?如果我不提供所有参数(在 2014a 和 b 上),我会收到“输入参数不足错误”(MATLAB:minrhs)。这似乎适用于“免费”函数,但不适用于构造函数/类成员。
    【解决方案4】:

    没有。与其他语言相比,OOP matlab 中的构造函数非常受限。在文档 AFAIK 中没有明确说明您可以有多个构造函数,但它在整个文档中以单数形式指代一个类的构造函数。

    https://www.mathworks.com/help/matlab/matlab_oop/class-constructor-methods.html

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2012-01-25
      • 2017-01-21
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多