在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

(无需修复上面的代码,我只是在分享)

最佳答案

我不认为这是机器的问题,但类(class)设计师和他当然有很好的动机来加类。编码的“哲学”部分是,您可以在包装器类中“拥有”该类,而无需对其进行密封定义。

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

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

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

10-12 04:43