【问题标题】:Constructor Not Assigning Values in MatlabMatlab中的构造函数不赋值
【发布时间】:2015-10-28 17:28:22
【问题描述】:

我正在尝试在 Matlab 中创建一些对象。我习惯于用 Java 编程,但能够在 Matlab 中做到这一点对我的研究很有帮助。

所以,我有一个特殊的课程:

classdef Lifter < handle


properties

    weightClass = 0;
    mean = 0;
    var = 0;
    nation = '';

end

methods

    function Lifter = Lifter(weightClass,mean,var,nation) %Constructor

        Lifter.weightClass = weightClass;
        Lifter.mean = mean;
        Lifter.var = var;
        Lifter.nation = nation;

    end

    function set.weightClass(this,weightClass)
    end       
    function set.mean(this,mean)
    end       
    function set.var(this,var)
    end       
    function set.nation(this,nation)
    end

    function value = get.weightClass(this)
        value = this.weightClass;
    end
    function value = get.mean(this)
        value = this.mean;
    end       
    function var = get.var(this)
        var = this.mean;
    end   
    function nation = get.nation(this)
        nation = this.nation;
    end

end

结束

相当标准,并没有真正做太多。

所以,在另一个页面中,我有:

function Competition()

Lifter1 = Lifter(56,1,1,'USA')

end

但是,运行它会给出:

Lifter1 = 

Lifter with properties:

weightClass: 0
       mean: 0
        var: 0
     nation: ''

任何帮助弄清楚为什么这些值没有从构造函数中正确初始化都会非常有帮助。

此外,如何在我的 Lifter1 对象上实际调用 setter 或 getter 方法的示例也会有所帮助。谢谢!

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这些设置器用于相关属性(声明为properties(Dependent))。而且,你的设置器没有实现(空),这意味着你所有的属性分配都不会做任何事情。这意味着属性保持在properties 部分中声明的默认值。

    稍后编辑

    如果我必须实现这个类,我会像下面的代码那样做:

        classdef Lifter < handle
    
    
                % --- PUBLIC SECTION ---
    
                properties(Dependent)
    
                        weight_class;
                end;
    
    
                methods
    
                        function obj = Lifter(weight_class)
                                obj.weight_class = weight_class;
                        end;
    
                        function set.weight_class(obj, weight_class)
                                if ~isa(obj, 'Lifter') ...
                                || ~isscalar(obj) ...
                                || ~isvalid(obj)
                                        error('Lifter:Arg', '"obj" must be a scalar valid handle object of class "Lifter".');
                                elseif ~isnumeric(weight_class) ...
                                || ~isscalar(weight_class) ...
                                || ~isreal(weight_class) ...
                                || (weight_class <= 0) % + other value tests
                                        error('Lifter:Arg', '"weight_class" must be a numeric positive scalar.');
                                else
                                        obj.weight_class_ = double(weight_class);
                                end;
                        end;
    
                        function val = get.weight_class(obj)
                                val = obj.weight_class_;
                        end;
                end;
    
    
                % --- PRIVATE SECTION ---
    
                properties(Access=private)
    
                        weight_class_;
    
                end;
    
        end
    

    其余属性的代码类似。测试:

        a = Lifter(100);         % Constructor + setter call
        a.weight_class = 75;     % Setter call
        disp(a.weight_class);    % Getter call
        a.weight_class = '85';   % Setter call with wrong value
    

    【讨论】:

    • 题外话 - 真的有必要在set.weight_class 方法中检查obj 是否是Lifter 对象吗? MATLAB 是否可以使用 obj 作为不同的对象来执行此方法。正如您所做的那样,我还在我的方法中进行了大量类型和值检查。 assert 是你的朋友。
    • @b3。在我看来,这是必要的。当对象作为第二个参数传递并且数字 arg 是第一个参数时,将调用相同的方法(因为正确的方法是由 arg 列表中最主要的类而不是第一个 arg 类选择的)。在 MATLAB 中,assertif/error 是我认为的口味问题(与 C 不同,它可以通过预处理器定义禁用)。
    • 对如何选择方法很感兴趣!现在为什么需要检查对象类型是有道理的。对于 setter 和 getter,尽管除了 obj.prop = value 之外我无法触发这些方法,所以我认为在这些情况下没有必要进行检查。
    【解决方案2】:

    你的 setter 和 getter 不应该包含点(虽然我同意如果它工作的话你的方式会更优雅):

    function set.weightClass(this,weightClass)
    end
    

    可能(应该):

    function set_weightClass(this,weightClass)
    end
    

    如果我全部替换,它可以正常工作。

    【讨论】:

    • 漂亮,非常感谢。在互联网上搜索时,我遇到了显示:“function set.weightClass(this,weightClass)”的指南也许只有它是一个 Value 类?不管怎样,非常感谢。
    • @user43395 抱歉坚持,但set.weightClassdependent 属性的设置器(值和句​​柄类之间的唯一区别是第一个返回修改后的对象,而第二个没有):mathworks.com/help/matlab/matlab_oop/…
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 2013-06-18
    • 1970-01-01
    • 2023-03-03
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多