如何定义保障属性可读的MATLAB抽象超类及可变/不可变子类?
MATLAB抽象类子类属性访问权限冲突的解决方法
问题核心是MATLAB要求子类继承的属性必须与超类的属性定义(包括访问权限)严格一致,而抽象属性默认的SetAccess为public,子类设置SetAccess = protected就会触发冲突报错。要同时保留抽象属性的约束和子类的访问权限控制,可通过以下方法实现:
正确实现方案
在超类的抽象属性定义中,添加SetAccess = {?}配置,允许子类重写该属性的访问权限:
classdef (Abstract) Super properties (Abstract, SetAccess = {?}) Prop end methods function DoSomething(obj) doSomethingElse(obj.Prop); end end end classdef MutableSub < Super properties Prop % 默认SetAccess=public,支持外部修改 end end classdef ImmutableSub < Super properties (SetAccess = protected) Prop % 仅内部/构造函数可修改,外部只读 end methods function obj = ImmutableSub(value) obj.Prop = value; end end end
方案说明
SetAccess = {?}是MATLAB类属性的特殊配置,用于允许子类重新定义该属性的访问权限,解决了超类与子类属性权限冲突的问题。- 超类的抽象属性约束依然生效:任何子类必须定义
Prop属性,否则在类定义阶段就会报错,避免了运行时才发现问题的情况。 ImmutableSub的Prop属性SetAccess设为protected,仅能在类内部(如构造函数)赋值,外部无法修改,满足只读需求;MutableSub保持默认的public权限,支持自由修改属性值。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

