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