在MATLAB中,类的attributes(在 classdef
之后定义)之一是Sealed
,这意味着没有类可以将其用作父类(super class)(或更准确地说,“以表明这些类尚未被设计为支持子类。” “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
(无需修复上面的代码,我只是在分享)
最佳答案
我不认为这是机器的问题,但类(class)设计师和他当然有很好的动机来加类。编码的“哲学”部分是,您可以在包装器类中“拥有”该类,而无需对其进行密封定义。
例如,假设Hello类是密封的,并且具有要在继承的类中使用的方法(或函数,如果需要)sayHello,则可以定义一个FreeHello类(公共(public)),该类包含Hello的实例。在构造函数中,构建相应的Hello,然后定义一个sayHello方法,该方法的主体仅调用您的Hello实例并使其执行sayHello方法(并相应地返回输出)。
为了“打开”密封的类,您需要对所有属性和公共(public)方法进行这些操作。当然,您仍然不能访问私有(private)方法,但是现在您可以根据需要子类化包装器类。
关于matlab - 从MATLAB中的Sealed类继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43118274/