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