在MATLAB中使用存储值进行OOP编程,存储值也会发生变化(如递增)

在MATLAB中使用存储值进行OOP编程,存储值也会发生变化(如递增),matlab,oop,Matlab,Oop,我对MATLAB中的面向对象编程比较陌生,所以也许我不理解它背后的原理,但我似乎无法理解这一点。我想要一组对象属性。一个属性是在对象创建时静态创建的,另一个是增量值,用于存储与对象使用相关的信息 classdef MyClass properties max_inc; % Statically created cap on the incrementer incr; % The incrementer end methods

我对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
在运行时,调用
Next(c)
时,它实际上似乎没有改变
incr
的值(它总是认为
incr
是起始值)。我不想使
incr
依赖,因为它确实需要存储它的值,这样我就知道它以前增加了多少次,而且我不能使它成为句柄对象,因为我需要多个对象同时处于活动状态(除非我完全误解了句柄对象的工作方式)。难道没有办法做到这一点吗?这似乎是一件非常容易处理的事情


编辑:我忘了明确地询问是否有办法使其工作,而且忘了询问递增逻辑在集合函数中的处理位置,就像我最初尝试的那样(似乎这是它更符合逻辑的地方,并且会使代码更可读)。

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

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
注意,我选择创建一个句柄类(通过继承抽象
句柄
类)一个值类。按照定义它的方式,每次调用
Next
,都必须返回修改过的对象,因为值类是通过副本(而不是引用)传递的

还要注意,我选择了减少属性的可访问性(隐藏类的内部实现通常是一个好的做法)

因此,现在
next
方法负责递增计数器,并在值超过最大限制时将值包装回
1

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

>> 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

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

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
注意,我选择创建一个句柄类(通过继承抽象
句柄
类)一个值类。按照定义它的方式,每次调用
Next
,都必须返回修改过的对象,因为值类是通过副本(而不是引用)传递的

还要注意,我选择了减少属性的可访问性(隐藏类的内部实现通常是一个好的做法)

因此,现在
next
方法负责递增计数器,并在值超过最大限制时将值包装回
1

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

>> 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

Next
必须返回对象
c
,并被称为:
c=Next(c)
。否则,使类继承自
句柄
Next
必须返回对象
c
,并称为:
c=Next(c)
。否则使类继承自
句柄
:感谢您的评论;我一定是误会了。文档声称,更改一个类中的值也将更改未来实例化类中的值;那么,这只是针对枚举句柄类吗?是的,那一页专门讨论枚举,无论是使用基于值还是基于句柄的类,我本人都是从句柄继承matlab类的,因为这会使事情按预期进行。@PeterM:绝对,我认为基于句柄的类应该是默认的。我几乎从未使用过值类,除非在对MATLAB内置类型进行子类化(
classdef MyDouble
)或定义enumsThank you征求您的意见;我一定是误会了。文档声称,更改一个类中的值也将更改未来实例化类中的值;那么,这只是针对枚举句柄类吗?是的,那一页专门讨论枚举,无论是使用基于值还是基于句柄的类,我本人都是从句柄继承matlab类的,因为这会使事情按预期进行。@PeterM:绝对,我认为基于句柄的类应该是默认的。我几乎从未使用过值类,除了在对MATLAB内置类型进行子类化(
classdef MyDouble
)或定义枚举时