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
свойство объекта осей:
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