MATLAB® graphics objects have the same precedence as objects of classes defined using the classdef
syntax. If you want to implement a method that accepts a graphics object as its first argument (for example, an axes handle), but dispatches to the method of your class, define the MATLAB graphics class as inferior to your class.
When evaluating expression involving objects of more than one class, MATLAB uses the dominant argument to determine which method or function to call.
Here is how MATLAB dispatches in response to a function call:
Determine the dominant argument based on the class of arguments.
If there is a dominant argument, call the method of the dominant class.
If arguments are of equal precedence, use the leftmost argument as the dominant argument.
If the class of the dominant argument does not define a method with the name of the called function, call the first function on the path with that name.
Specify the relative precedence of MATLAB classes using the InferiorClasses
class attribute. Here is the basic syntax:
classdef (InferiorClasses = {?class1,?class2}) ClassName
The following definition of the TemperatureData
class implements a specialized version of plot
to graph temperature data. The class plot
method supports a variable number of input arguments to allow an axes handle as the first argument:
plot(obj) plot(ax,obj)
obj
is an instance of the TemperatureData
class and ax
is an axes
handle.
MATLAB calls the plot
method in both cases because the TemperatureData
class specifies the matlab.graphics.axis.Axes
as inferior.
classdef (InferiorClasses = {?matlab.graphics.axis.Axes}) TemperatureData properties Time Temperature end methods function obj = TemperatureData(x,y) obj.Time = x; obj.Temperature = y; end function plot(varargin) if nargin == 1 obj = varargin{1}; plot(obj.Time,obj.Temperature) elseif nargin == 2 ax = varargin{1}; obj = varargin{2}; plot(ax,obj.Time,obj.Temperature) elseif nargin > 2 ax = varargin{1}; obj = varargin{2}; plot(ax,obj.Time,obj.Temperature,varargin{3:end}) end datetick('x') xlabel('Time') ylabel('Temperature') end end end
The following call to plot
dispatches to the TemperatureData
plot
method, not the built-in plot
function, because the TemperatureData
object is dominant over the axes object.
x = 1:10; y = rand(1,10)*100; ax = axes; td = TemperatureData(x,y); plot(ax,td)
When you declare a class as inferior to your class, and both classes define a method with the same name, MATLAB dispatches to your class method regardless of argument order.
Suppose the TemperatureData
class that is described in the previous section defines a set
method. If you attempt to assign an object of the TemperatureData
class to the UserData
property of an axes object:
td = TemperatureData(x,y);
set(gca,'UserData',td)
The results is a call to the TemperatureData
set
method. MATLAB does not call the built-in set
function.
To support the use of a set
function with inferior classes, implement a set
method in your class that calls the built-in set
function when the first argument is an object of the inferior class.
function set(varargin) if isa(varargin{1},'matlab.graphics.axis.Axes') builtin('set',varargin{:}) else ... end