【问题标题】:Inheriting from Sealed classes in MATLAB从 MATLAB 中的 Sealed 类继承
【发布时间】:2017-08-24 09:40:05
【问题描述】:

在 MATLAB 中,一个类(在classdef 之后定义)的attributes 之一是Sealed,这意味着没有任何类可以将其用作超类(或者更准确地说,“表示这些类并未设计为支持子类。"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

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

【问题讨论】:

    标签: matlab oop inheritance sealed undocumented-behavior


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果你仔细观察,这就是问题第二部分中的代码“正在做”的事情......它获取正在扩展的类的所有方法的句柄,然后转发调用到内部类。
    • 真实且更笼统;理论上,您可以定义一个函数,以您编写它的方式返回密封项目的公共对象;所以竖起大拇指。一张小纸条;您还应该为属性包括类似的机制。您最终是否“打开”了密封类?如果我可以问,你为什么要这样做?
    • 我没有完成该代码,因为它并没有真正起作用(不记得到底是什么问题)。看到如何没有接受的答案仍然没有解决:) 这主要是出于教育目的而提出的,尽管当时我可能已经尝试修改 table 的某些功能并且不想复制整个类定义文件夹像这样的小事......
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多