在MATLAB中,一个类的
attributes之一(在
classdef之后定义)是Sealed,这意味着没有类可以将它用作超类(或者更确切地说,“表示这些类没有被设计为支持子类. “
1).
例如,如果我尝试实例化一个定义如下的类(考虑表是密封的):
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
(没有必要修复上面的代码,我只是分享)