matlab - 从 MATLAB 中的密封类继承

标签 matlab oop inheritance sealed undocumented-behavior

在 MATLAB 中,attributes 之一一个类(在 classdef 之后定义)的 Sealed,这意味着任何类都不能将它用作父类(super class)(或者更准确地说,“表明这些类尚未被旨在支持子类。 1 )。

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

classdef SomeLie < table

end

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

>> A = SomeLie;
Error using SomeLie
Class 'table' is Sealed and may not be used as a superclass.

由于我拒绝被机器告知我可能可能不做什么,我想继承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

(上面的代码不用修正,我只是分享)

最佳答案

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

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

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

关于matlab - 从 MATLAB 中的密封类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43118274/

相关文章:

php - 如何在接口(interface)文档中记录@throws

python - 获取 sqlalchemy 基类对象而不是子对象

c++ - 将基类的const成员初始化为派生类

algorithm - 使用 : system time() 执行 R 代码

matlab - 从 Matlab 绘图中检索 X 和 Y 值

arrays - 如何复制矩阵中超过阈值的值并将矩阵的其余部分设置为 0?

c# - 在我的设计中实现自定义 Hook 的最佳方式

MATLAB Cell2Mat 逐行转换

c++ - 在头文件中声明类型时,“unordered_set”未命名类型

angularjs - 继承 AngularJS 指令以创建可重用组件