Графические объекты 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
отправляет методу plot
TemperatureData
, не встроенной функции 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)
Результатами является вызов метода set
TemperatureData
. MATLAB не вызывает встроенную функцию set
.
Чтобы поддержать использование функции set
с нижними классами, реализуйте метод set
в своем классе, который вызывает встроенную функцию set
, когда первый аргумент является объектом нижнего класса.
function set(varargin) if isa(varargin{1},'matlab.graphics.axis.Axes') builtin('set',varargin{:}) else ... end