exponenta event banner

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

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

Графические объекты 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 свойство объекта axes:

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

Связанные темы