Когда MATLAB® вызывает обычный метод, который имеет список аргументов, он использует следующие критерии, чтобы определить который метод вызвать
Класс крайнего левого аргумента, класс которого не задан столь же нижний к классу никакого другого аргумента, выбран как доминирующий класс, и его метод вызывается.
Если этот класс не задает вызываемый метод, то функция с тем именем, которое находится на пути MATLAB, вызывается.
Если никакая такая функция не существует, MATLAB выдает ошибку, указывая, что доминирующий класс не задает именованный метод.
MATLAB использует доминирующую диспетчеризацию аргумента, чтобы определить который версия метода вызвать. Во время диспетчеризации метода MATLAB определяет доминирующий класс из числа аргументов в вызове. В общем случае все классы MATLAB задали использование classdef
синтаксис имеет одинаковый приоритет в целях диспетчеризации метода.
Классы задали использование classdef
синтаксис более приоритетен по сравнению с этими классами MATLAB:
double
единственный
int64
uint64
int32
uint32
int16
uint16
int8
uint8
'char'
Строка
логический
ячейка
Struct ()
, и function_handle
.
В общем случае, когда два или больше объекта являются частью списка аргументов, метод, заданный для класса крайнего левого объекта, вызывается. Однако пользовательские классы могут задать относительное преобладание определенных классов. Для получения информации смотрите Приоритет Класса.
Например, предположите classA
задает classB
как нижний и предполагают, что оба класса задают метод под названием combine
.
Вызов метода с объектом classB
и classA
:
combine(B,A)
на самом деле вызывает combine
метод classA
потому что A
доминирующий аргумент.
Классы MATLAB поддерживают и синтаксис функциональной и записи через точку для вызывающих методов. Например, если setColor
метод класса объекта X
, затем вызов setColor
с функциональным обозначением был бы:
X = setColor(X,'red');
Эквивалентный вызов метода с помощью записи через точку:
X = X.setColor('red')
Однако в определенных случаях, результаты для записи через точку могут отличаться относительно того, как диспетчеризация MATLAB работает:
Если существует перегруженный subsref
, это вызывается каждый раз, когда с помощью записи через точку. Таким образом, оператор сначала тестируется, чтобы видеть, является ли это преобразованное в нижний индекс присвоение.
Если существует не перегруженный subsref
, затем setColor
должен быть метод X
. Обычная функция или конструктор класса никогда не называются с помощью этого обозначения.
Только аргумент X
(слева от точки), используется для диспетчеризации. Никакие другие аргументы, даже если доминирующий, не рассматриваются. Поэтому запись через точку может вызвать только методы X
; методы другого аргумента никогда не называются.
Случай, Где Результат Отличается. Вот пример случая, где точечное и функциональное обозначение может дать различные результаты. Предположим, что у вас есть следующие классы:
classA
задает метод под названием methodA
это требует объекта classB
в качестве одного из его аргументов
classB
задает classA
как нижний к classB
classdef (InferiorClasses = {?classA}) classB ... end
methodA
метод задан с двумя входными параметрами, один из которых является объектом classB
:
classdef classA methods function methodA(obj,obj_classB) ... end end
classB
не задает метод с тем же именем как methodA
. Поэтому следующий синтаксис заставляет MATLAB искать путь функцию с тем же именем как methodA
потому что второй аргумент является объектом доминирующего класса. Если функция с тем именем существует на пути, то MATLAB пытается вызвать эту функцию вместо метода classA
и скорее всего возвращает синтаксическую ошибку.
obj = classA(...); methodA(obj,obj_classB)
Запись через точку более строга в своем поведении. Например, этот вызов methodA
:
obj = classA(...); obj.methodA(obj_classB)
может вызвать только methodA
из класса obj
.
Можно сослаться на свойства объекта или методы с помощью выражения в синтаксисе точечных круглых скобок:
obj.(expression)
Выражение должно оценить к char
вектор, который является именем свойства или метода. Например, следующие операторы эквивалентны:
obj.Property1 obj.('Property1')
В этом случае, obj
объект класса, который задает свойство под названием Property1
. Поэтому можно передать char
переменная в круглых скобках к ссылке на свойство:
propName = 'Property1'; obj.(propName)
Можно вызвать метод и передать входные параметры методу с помощью другого набора круглых скобок:
obj.(expression)(arg1,arg2,...)
Используя это обозначение, можно сделать динамические ссылки на свойства и методы таким же образом, можно создать динамические ссылки на поля structs
.
Как пример, предположите, что объект имеет методы, соответствующие каждый день недели. Эти методы имеют те же имена как дни недели (Monday
, Tuesday
, и так далее). Кроме того, методы берут в качестве char
векторные входные параметры, текущий день месяца (дата). Теперь предположите, что вы пишете функцию, в которой вы хотите вызвать правильный метод в течение текущего дня.
Используйте выражение, созданное с date
и datestr
функции:
obj.(datestr(date,'dddd'))(datestr(date,'dd'))
Выражение datestr(date,'dddd')
возвращает текущий день как char
вектор. Например:
datestr(date,'dddd')
ans =
Tuesday
Выражение datestr(date,'dd')
возвращает текущую дату как char
вектор. Например:
datestr(date,'dd')
ans =
11
Поэтому выражение с помощью точечных круглых скобок (обратился к вторнику 11-е) является эквивалентом:
obj.Tuesday('11')
Можно использовать точечную индексацию в результат вызова метода получить значение. Например, этот класс задает свойство и метод конструктора. Конструктор устанавливает значение свойства после оценки выражения с помощью входного параметра.
classdef polyEval properties Result end methods function obj = polyEval(x) if nargin obj.Result = 2*x.^3 + 7*x.^2 + 2*x + 7; end end end end
Можно индексировать в результат вызова метод конструктора получить доступ к значению свойства. Например, этот вызов polyEval()
возвращает значение, которое присвоено свойству. Экземпляр polyEval
класс создается как временная переменная и не сохранен в рабочей области.
polyEval(-3.5).Result
ans = 0
В этом случае, выражение, polyEval(-3.5).Result
представляет значение 0
(значение -3.5
корень полинома). Можно присвоить результат выполнения этого выражения к переменной или использовать его в других выражениях.
Можно отметить точкой индекс в результат любого метода, который возвращает результат, для которого точечная индексация задана, такие как объект или структура, которая может быть индексирована с помощью свойства или имени поля. Необходимо включать круглые скобки во все выражения индексации, даже при отсутствии аргументов. Например, чтобы индексировать в результат вызова polyEval()
конструктор без входных параметров, используйте это выражение.
polyEval().Result
Для получения дополнительной информации об индексации в результат вызовов функции смотрите Индексацию в Результаты Вызова функции.
Могут быть ситуации, где вы хотите создать методы для внутреннего расчета в классе, но не хотите публиковать эти методы как часть открытого интерфейса к классу. В этих случаях можно использовать Access
припишите, чтобы установить доступ к одной из следующих опций:
public
— Любой код, имеющий доступ к объекту класса, может получить доступ к этому методу (значение по умолчанию).
private
— Ограничивает доступ к методу к классу определения, исключая подклассы. Подклассы не наследовали закрытые методы.
protected
— Ограничивает доступ к методу к классу определения и разделяет на подклассы выведенный из класса определения. Подклассы наследовали этот метод.
Список доступа — Ограничивает доступ к методу к классам в списке доступа. Для получения дополнительной информации см. Доступ для членов класса
Локальные и вложенные функции в файлах метода имеют тот же доступ как метод. Локальные функции в файле определения класса имеют частный доступ к классу, заданному в том же файле.
Подкласс может заменить реализацию метода, заданного в суперклассе. Если метод подклассов должен выполнить дополнительный код вместо завершенной замены метода суперкласса. Классы MATLAB могут использовать специальный синтаксис для вызова методов суперкласса от реализации подкласса для одноименного метода.
Синтаксис, чтобы вызвать метод суперкласса в классе подкласса использует символ:
MethodName@SuperclassName
Например, следующий disp
метод задан для Stock
класс, который выведен из Asset
класс. Метод сначала вызывает Asset
класс disp
метод, передавая Stock
возразите так, чтобы Asset
компоненты Stock
объект может быть отображен. После Asset
disp
метод возвращается, Stock
disp
метод отображает два Stock
свойства:
classdef Stock < Asset methods function disp(s) disp@Asset(s) % Call base class disp method first fprintf(1,'Number of shares: %g\nShare price: %3.2f\n',... s.NumShares,s.SharePrice); end % disp end end
Следующие ограничения применяются к вызову методов суперкласса. Можно использовать это обозначение только в:
Метод, имеющий то же имя как метод суперкласса, вы вызываете
Класс, который является подклассом суперкласса, метод которого вы вызываете
MATLAB builtin
функция позволяет вам вызвать встроенную версию функции, которая была перегружена методом.