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

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

Графические объекты MATLAB® имеют тот же приоритет как пользовательские объекты. Если вы хотите реализовать метод, который принимает графический объект как его первый аргумент (например, указатель осей), задайте класс графики 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

Похожие темы

Была ли эта тема полезной?