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