【发布时间】:2017-08-24 09:40:05
【问题描述】:
在 MATLAB 中,一个类(在classdef 之后定义)的attributes 之一是Sealed,这意味着没有任何类可以将其用作超类(或者更准确地说,“表示这些类并未设计为支持子类。"1)。
例如,如果我尝试实例化一个定义如下的类(考虑到table 是Sealed):
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