Calling superclass method outside of redefined method
显示 更早的评论
I have an "DataAnalyzer" classdef that has a method that slowly computes exact solutions to certain queries.
classdef DataAnalyzer < HandleCompatibleSuperClass
methods
function obj = DataAnalyzer(dat,varargin)
obj = obj@HandleCompatibleSuperClass(varargin{:})
% lengthy constructor using dat with immutable properties
end
y_results = analyze(obj,x_queries) % slow analysis method
% lots of other user methods to analyze data
end
end
For debugging, we can get good enough results with a DataInterpolator, that provides all the same methods EXCEPT redefines the analyze method.
classdef DataInterpolator < DataAnalyzer
properties(SetAccess=immutable)
DomainX
RangeY
end
methods
function obj = DataInterpolator(x_domain,dat,varargin)
obj = obj@DataAnalyzer(dat,varargin{:});
obj.DomainX = x_domain;
obj.RangeY = analyze@DataAnalyzer(obj,x_domain);
% ^ Can't do this!
end
function y_results = analyze(obj,x_queries)
y_results = interp1(obj.DomainX,obj.RangeY,x_queries,'linear');
end
% all those other useful methods to analyze data
end
end
From https://www.mathworks.com/help/matlab/matlab_oop/calling-superclass-methods-on-subclass-objects.html
Subclass methods can call superclass methods if both methods have the same name.
I realize that I could do something like this...
classdef DataInterpolator < DataAnalyzer
properties(SetAccess=immutable)
DomainX
RangeY
end
methods
function obj = DataInterpolator(x_domain,dat,varargin)
obj = obj@DataAnalyzer(dat,varargin{:});
% Create a temp object, but time is a penalty.
temp_obj = DataAnalyzer(dat,varargin{:});
obj.DomainX = x_domain;
obj.DomainY = analyze(temp_obj,x_domain);
end
function y_results = analyze(obj,x_queries)
y_results = interp1(obj.DomainX,obj.RangeY,x_queries,'linear');
end
% all those other useful methods to analyze data
end
end
But that feels like a really ugly hack, even for debug. Worse, I lose the performance benefits of constructing obj essentially twice.
Is there a smarter way to accomplish what I'd like to do here?
采纳的回答
更多回答(2 个)
Why do you have to do it through inheritance? Couldn't you pass a function handle to the analyze() method that you want as a constructor argument?
classdef DataAnalyzer < HandleCompatibleSuperClass
properties(SetAccess=immutable)
DomainX
RangeY
analyzeMethod; %handle to analyze() method
end
methods
function obj = DataAnalyzer(dat,analyzeMethod,varargin)
obj = obj@HandleCompatibleSuperClass(dat,varargin{:})
obj.RangeY=analyzeMethod(obj.DomainX);
obj.analyzeMethod=analyzeMethod; %store it to a property for later use, if desired.
end
end
end
It should be enough just to provide an overriding analyze() method in the subclass,
classdef DataApproximator < DataAnalyzer
methods
function obj = DataApproximator(dat,varargin)
obj = obj@DataAnalyzer(dat,varargin{:});
end
function y_results = analyze(obj,x_queries)
y_results = interp1(obj.DomainX,obj.RangeY,x_queries,'linear');
end
% all those other useful methods to analyze data
end
end
3 个评论
Jacob Lynch August
2021-2-16
编辑:Jacob Lynch August
2021-2-16
Jacob Lynch August
2021-2-16
编辑:Jacob Lynch August
2021-2-16
I'm not proud of this approach.
I think it's pretty good, although I would probably refine it as below. I think some degree of hackery will be inevitable, since if the implementation of the superclass is uneditable, you are blocked from doing things the "right way".
classdef DataApproximator < DataAnalyzer
properties(SetAccess=immutable,GetAccess=private)
DomainX (:,1)
RangeY (:,:)
end
methods
function obj = DataApproximator(x_domain,dat,varargin)
% Construct object
obj = obj@DataAnalyzer(dat,varargin{:});
obj.DomainX = x_domain;
obj.RangeY = analyze(obj,'superclass');
end
function y_results = analyze(obj,varargin)
normalOperation = ~(nargin>1 && strcmp(varargin{1},'superclass') );
if normalOperation
y_results = interp1(obj.DomainX,obj.RangeY,'linear',nan);
else
y_results = analyze@DataAnalyzer(obj,obj.DomainX);
end
end
end
end
类别
在 帮助中心 和 File Exchange 中查找有关 Stable Distribution 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!