Calling superclass method outside of redefined method
Show older comments
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?
Accepted Answer
More Answers (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
1 Comment
Jacob Lynch August
on 16 Feb 2021
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 Comments
Jacob Lynch August
on 16 Feb 2021
Edited: Jacob Lynch August
on 16 Feb 2021
Jacob Lynch August
on 16 Feb 2021
Edited: Jacob Lynch August
on 16 Feb 2021
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
Categories
Find more on Stable Distribution in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!