继承MATLAB中的密封类

Dev*_*-iL 6 oop matlab inheritance sealed undocumented-behavior

在MATLAB中,类的一个属性(后面定义classdef)是Sealed,这意味着没有类可以将它用作超类(或者更确切地说," 表示这些类没有被设计为支持子类. " 1).

例如,如果我尝试实例化一个定义如下的类(考虑tableSealed):

classdef SomeLie < table

end
Run Code Online (Sandbox Code Playgroud)

我会得到'MATLAB:class:sealed'错误:

>> A = SomeLie;
Error using SomeLie
Class 'table' is Sealed and may not be used as a superclass.
Run Code Online (Sandbox Code Playgroud)

由于我拒绝由机器来告诉我可能可能不会做,我想继承一个Sealed,而不管.我怎样才能在MATLAB R2017a中做到这一点?

我很难相信这个系统是完全不透气的,所以我正在寻找一种能够导致该Sealed属性被忽略的解决方案(或类似的东西).所需的解决方案应该无需修改任何"库类定义"即可从中删除Sealed.


我试着玩"反思",但到了死胡同......

classdef SomeLie % < table  
  properties (Access = private)
    innerTable table;
  end

  properties (GetAccess = public)
    methodHandles struct = struct();
  end

  methods    
    function slObj = SomeLie(varargin)
      slObj.innerTable = table(varargin{:});
%     methodHandles = methods(slObj.innerTable);
      ml = ?table; ml = {ml.MethodList.Name}.';
      ml = setdiff(ml,'end');
      tmpStruct = struct;
      for indM = 1:numel(ml)
        tmpStruct.(ml{indM}) = str2func([...
          '@(varargin)' ml{indM} '(slObj.innerTable,varargin{:})']);
      end
      slObj.methodHandles = tmpStruct;
    end

    function varargout = subsref(slObj,varargin)
      S = struct(slObj);
      varargout{:} = S.methodHandles.(varargin{1}.subs)(varargin{:});      
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

(没有必要修复上面的代码,我只是分享)

pac*_*nda 0

我不认为机器是问题所在,但班级设计者和他肯定有很好的动机来密封班级。编码的“哲学”,一部分,您可以在包装类中“拥有”该类,而无需将其定义为密封的。

例如,假设类 Hello 是密封的,并且有一个方法(或函数,如果您愿意)sayHello,您想在继承类中使用它,您可以定义一个包含 Hello 实例的类 FreeHello (public)。在构造函数中,您构建相应的 Hello,然后定义一个 sayHello 方法,其主体仅调用您的 Hello 实例并使其执行 sayHello 方法(并相应地返回输出)。

为了“打开”密封类,您需要对所有属性和公共方法执行这些操作;当然,您仍然无法访问私有方法,但现在您可以根据需要对包装类进行子类化。