exponenta event banner

Функции перегрузки в определениях классов

Причины перегрузочных функций

Классы могут переопределять функции MATLAB ®, реализуя методы с одинаковыми именами. Перегрузка полезна при определении специализированных типов, которые должны вести себя как существующие типы MATLAB. Например, для работы с объектами класса можно реализовать реляционные операции, функции печати и другие часто используемые функции MATLAB.

Можно также изменить поведение по умолчанию, реализовав определенные функции, управляющие этим поведением. Дополнительные сведения о функциях, изменяющих поведение по умолчанию, см. в разделе Методы, изменяющие поведение по умолчанию.

Реализация перегруженных функций MATLAB

Методы класса могут обеспечивать реализации функций MATLAB, которые работают только на экземплярах класса. Это ограничение возможно, поскольку MATLAB всегда может определить, какому классу принадлежит объект.

MATLAB использует доминирующий аргумент для определения версии вызываемой функции. Если доминирующим аргументом является объект, то MATLAB вызывает метод, определенный классом объекта, если таковой существует.

В случаях, когда класс определяет метод с тем же именем, что и глобальная функция, реализация функции классом, как говорят, перегружает исходную глобальную реализацию.

Для перегрузки функции MATLAB:

  • Определите метод с тем же именем, что и функция, которую требуется перегрузить.

  • Убедитесь, что список аргументов метода принимает объект класса, который MATLAB использует для определения версии вызова.

  • Выполните необходимые шаги в методе для реализации функции. Например, доступ к свойствам объекта для управления данными.

Как правило, способ, который перегружает функцию, дает результаты, аналогичные функции MATLAB. Однако нет никаких требований к внедрению метода перегрузки. Метод перегрузки не должен соответствовать сигнатуре перегруженной функции.

Примечание

MATLAB не поддерживает перегрузку функций с использованием различных сигнатур для одного и того же имени функции.

Перегрузка штриховой функции

Удобно перегружать часто используемые функции для работы с объектами вашего класса. Например, предположим, что класс определяет свойство, в котором хранятся данные, часто отображаемые на графике. MyData класс переопределяет bar и добавляет заголовок к графу:

classdef MyData
   properties
      Data
   end
   methods
      function obj = MyData(d)
         if nargin > 0
            obj.Data = d;
         end
      end
      function bar(obj)
         y = obj.Data;
         bar(y,'EdgeColor','r');
         title('My Data Graph')
      end
   end
end

MyData bar метод имеет то же имя, что и MATLAB bar функция. Тем не менее, MyData bar метод требует MyData объект в качестве входных данных. Поскольку метод является специализированным для MyData объекты, он может извлечь данные из Data и создайте специализированный график.

Для использования bar создайте объект:

y = rand(1,10);
md = MyData(y);

Вызовите метод с помощью объекта:

bar(md)

Также можно использовать точечную нотацию:

md.bar

Внедрение операторов MATLAB

Классы, предназначенные для реализации новых типов данных MATLAB, обычно определяют определенные операторы, такие как сложение, вычитание или равенство.

Например, стандартное добавление MATLAB (+) не может добавить два многочлена, поскольку эта операция не определена простым сложением. Тем не менее, polynomial класс может определять свой собственный plus метод, который вызывает язык MATLAB для добавления polynomial при использовании + символ:

p1 + p2

Сведения об операторах перегрузки см. в разделе Перегрузка оператора.

Правила именования во избежание конфликтов

В класс включаются имена методов, свойств и событий. Поэтому во избежание конфликтов имен следует придерживаться следующих правил:

  • Можно повторно использовать имена, используемые в несвязанных классах.

  • Если у члена нет общего или защищенного доступа, можно повторно использовать имена в подклассах. Эти имена затем ссылаются на совершенно другие методы, свойства и события без влияния на определения суперкласса

  • В пределах класса все имена существуют в одном пространстве имен и должны быть уникальными. Класс не может определять два метода с одинаковым именем, а класс не может определять локальную функцию с тем же именем, что и метод.

  • Имя статического метода рассматривается без префикса класса. Таким образом, статическое имя метода без префикса класса не может совпадать с именем любого другого метода.

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