在超类方法中修改子类的不可变/受保护变量

时间:2015-03-02 10:21:06

标签: matlab oop inheritance

我尝试使用超类方法或外部实用程序函数修改子类的不可变/受保护属性(我试图在子类的构造函数中使用此函数,疗程)。

示例(我想做的):

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

1 个答案:

答案 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 ,为您提供更灵活的语法范围。