我尝试使用超类方法或外部实用程序函数修改子类的不可变/受保护属性(我试图在子类的构造函数中使用此函数,疗程)。
示例(我想做的):
classdef Sup
methods
function self = setProperties(self, varargin)
% This method sets the properties of the object
% the input arguments come in the form 'propname1', val1, 'propname2', val2, ...
...
end % setProperties
end % methods
end % classdef Sup
classdef sub < Sup
properties (SetAccess = immutable)
prop1
prop2
prop3
end % properties
methods
function self = sub(varargin)
% constructor
self = setProperties(self, varargin)
end % sub
end % methods
end % classdef sub
>> SomeObj = sub('prop1', 1, 'prop2', 10, 'prop3', 100);
此代码无效,我收到错误消息&#39;您无法设置只读属性&#39; prop1&#39; sub。&#39;
我可以设置要保护的子属性,但我不希望它们是公开的。我也认为setProperties将是一个外部实用程序函数(未在超类中定义),但是再次,我无法在sub的构造函数中使用setProperties。
非常感谢你的帮助。 谢谢,
Avihay
答案 0 :(得分:0)
如果您愿意,可以将SetAccess
的{{1}}属性设置为sub
- 换句话说,它们只能由班级?Sup
设置。
这似乎做了你直接要求的事情 - 但是,我应该说这似乎是一种不同寻常的模式。我想知道一个更好的建议是否可能是为了检查你为什么需要这样做,也许重新设计你的阶级关系。
编辑:
如果您需要的是在构造函数中方便地设置属性的一般方法,您可以尝试从内置类Sup
继承您的类。例如,
hgsetget
classdef sub < hgsetget
properties (SetAccess = immutable)
prop1
prop2
prop3
end % properties
methods
function self = sub(varargin)
set(self,varargin{:})
end
end
end
为您提供内置方法hgsetget
(和set
),可以使用语法get
和类似方法(如MATLAB Handle Graphics对象,因此set(obj, 'myprop', myval, 'myprop2', myval2)
中的hg
。
这对你来说可能更方便。但请注意,hgsetget
本身是hgsetget
的子类,因此您必须熟悉作为handle
对象的类。但是,如果您正在考虑handle
属性,那么您可能已经确定了。
编辑2:
另一种可以使用值对象的方法可能如下:
immutable
或者,您可以在构造函数中使用classdef sub
properties (SetAccess = immutable)
prop1
prop2
prop3
end % properties
methods
function self = sub(varargin)
% constructor
props = varargin(1:2:end-1);
vals = varargin(2:2:end);
for i = 1:numel(props)
self.(props{i}) = vals{i};
end
end
end
end
,为您提供更灵活的语法范围。