Доминирующий аргумент в перегруженных графических функциях

Приоритет графического объекта

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

Похожие темы