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

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

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

Похожие темы