MATLAB® графические объекты имеют тот же приоритет, что и объекты классов, заданных с помощью classdef
синтаксис. Если вы хотите реализовать метод, который принимает графический объект в качестве его первого аргумента (для примера, указателя на оси), но отправляет в метод вашего класса, задайте класс графики MATLAB как уступающий вашему классу.
При оценке выражения с участием объектов более чем одного класса MATLAB использует доминирующий аргумент, чтобы определить, какой метод или функцию вызывать.
Вот как MATLAB отправляет в ответ на вызов функции:
Определите доминирующий аргумент на основе класса аргументов.
Если существует доминирующий аргумент, вызовите метод доминирующего класса.
Если аргументы имеют равный приоритет, используйте крайний левый аргумент в качестве доминирующего аргумента.
Если класс доминирующего аргумента не задает метод с именем вызываемой функции, вызовите первую функцию в пути с этим именем.
Задайте относительный приоритет классов MATLAB, используя InferiorClasses
атрибут класса. Вот основной синтаксис:
classdef (InferiorClasses = {?class1,?class2}) ClassName
Следующее определение TemperatureData
класс реализует специализированную версию plot
для построения графика данных о температуре. Класс plot
метод поддерживает переменное количество входных параметров, чтобы разрешить использование указателя на оси в качестве первого аргумента:
plot(obj) plot(ax,obj)
obj
является образцом TemperatureData
класс и ax
является axes
указатель.
MATLAB вызывает plot
метод в обоих случаях, потому что TemperatureData
класс задает matlab.graphics.axis.Axes
как неполноценный.
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
Следующий вызов для plot
отправляет в TemperatureData
plot
метод, а не встроенный plot
function, потому что TemperatureData
объект доминирует над объектом осей.
x = 1:10; y = rand(1,10)*100; ax = axes; td = TemperatureData(x,y); plot(ax,td)
Когда вы объявляете класс уступающим вашему классу, и оба класса определяют метод с одинаковым именем, MATLAB отправляет вашему методу класса независимо от порядка аргументов.
Предположим, что TemperatureData
класс, который описан в предыдущем разделе, задает set
способ. Если вы пытаетесь назначить объект TemperatureData
класс к UserData
свойство объекта осей:
td = TemperatureData(x,y);
set(gca,'UserData',td)
Результаты являются вызовом TemperatureData
set
способ. MATLAB не вызывает встроенный set
функция.
Для поддержки использования set
функция с нижестоящими классами, реализуйте set
метод в вашем классе, который вызывает встроенную set
function, когда первый аргумент является объектом низшего класса.
function set(varargin) if isa(varargin{1},'matlab.graphics.axis.Axes') builtin('set',varargin{:}) else ... end