1

我对 MATLAB 中的面向对象编程比较陌生,所以也许我只是不了解它背后的哲学,但我似乎无法弄清楚这一点。我想要一组对象属性。一个属性是在对象创建时静态创建的,另一个是一个递增值,用于存储与对象使用相关的信息。

classdef MyClass
    properties
       max_inc; % Statically created cap on the incrementer
       incr;    % The incrementer
    end
    methods
        % Constructor
        function c = MyClass(set_max)
            c.max_inc = set_max;
            c.incr = 1;
        end

        % Function to do some stuff
        function value = Next(c)
            % Do some stuff
            set(c, 'incr', c.incr + 1);
        end

        % Set function which is causing me trouble
        function c = set.incr(c, value)
            if(value <= c.max_inc)
                c.incr = value;
            else
                c.incr = 1;
            end
        end
    end
end

通过摆脱 set 函数并将函数实现Next(c)为:

% Function to do some stuff
function value = Next(c)
    % Do some stuff
    curr_inc = c.incr;
    if(curr_inc < c.max_inc)
        c.incr = curr_inc + 1;
    else
        c.incr = 1;
    end
end

当它运行时,它实际上似乎并没有改变incrwhenNext(c)被调用的值(它总是认为incr是起始值)。我不想incr依赖,因为它确实需要存储它的值,所以我知道它之前增加了多少次,我不能把它变成一个句柄对象,因为我需要多个同时处于活动状态(除非我完全误解了句柄对象的工作原理)。有没有办法做到这一点?这似乎对一个对象来说应该是一件非常容易的事情。

编辑:我忘了明确询问是否有办法使这项工作,但这样做的地方增量器逻辑是在我最初尝试过的 set 函数中处理的(这似乎是它更合乎逻辑的地方,并将制作更具可读性的代码)。

4

1 回答 1

1

以下是我将如何实现这样一个类:

classdef MyClass < handle
    properties (Access = protected)
       max_inc
    end
    properties (SetAccess = protected)
       incr
    end
    methods
        function obj = MyClass(set_max)
            obj.max_inc = set_max;
            obj.incr = 1;
        end
        function next(obj)
            obj.incr = obj.incr + 1;
            if obj.incr > obj.max_inc
                obj.incr = 1;
            end
        end
    end
end

示例用法:

>> c = MyClass(5)
c = 
  MyClass with properties:

    incr: 1

>> for i=1:7, c.next(); end
>> c
c = 
  MyClass with properties:

    incr: 3

请注意,我选择创建一个句柄类(通过从抽象handle类继承)而不是类。按照您定义它的方式,每次调用时都必须返回修改后的对象Next,因为值类是通过副本(而不是通过引用)传递的。

另请注意,我选择减少属性的可访问性(隐藏类的内部实现通常是一个好习惯)。

所以现在该next方法负责增加计数器,并1在超过最大限制时将值包装回。

当然,拥有句柄类并不会阻止您创建多个对象,每个对象都有自己的独立状态:

>> c1 = MyClass(5); c2 = MyClass(10);
>> for i=1:3, c1.next(); end
>> for i=1:6, c2.next(); end

>> c1
c1 = 
  MyClass with properties:

    incr: 4
>> c2
c2 = 
  MyClass with properties:

    incr: 7

让两个变量引用同一个对象的唯一方法是,以这种方式分配引用:

>> c3 = c1; c3.next();
>> c1
c1 = 
  MyClass with properties:

    incr: 5
于 2013-08-22T03:11:56.013 回答