Чтобы вызвать метод класса, определение класса должно быть в MATLAB® путь, как описано в следующих разделах.
Существует два типа папок, которые могут содержать файлы определения классов.
Папки Path - Папка находится в пути MATLAB, и имя папки не начинается с @
символ. Используйте этот тип папки, когда требуется несколько классов и функций в одной папке. Все определение класса должно содержаться в одном файле.
Папки классов - имя папки начинается с символа @, за которым следует имя класса. Папка находится не в пути MATLAB, но ее родительская папка находится в пути. Используйте этот тип папки, когда вы хотите использовать несколько файлов для одного определения класса.
См. path
для получения информации о пути MATLAB.
Папки, содержащие файлы определения классов, указаны в пути MATLAB. Поэтому определения классов, помещенные в папки path, ведут себя как любая обычная функция относительно приоритета - первое вхождение имени в пути MATLAB имеет приоритет над всеми последующими вхождениями с таким же именем.
Имя каждого файла определения класса должно совпадать с именем класса, заданным в classdef
ключевое слово. Использование папки path устраняет необходимость создания отдельной папки класса для каждого класса. Однако все определение класса, включая все методы, должно содержаться в одном файле.
Предположим, что у вас есть три класса, определенных в одной папке:
.../path_folder/MyClass1.m .../path_folder/MyClass2.m .../path_folder/MyClass3.m
Чтобы использовать эти классы, добавьте path_folder
к пути MATLAB:
addpath path_folder
Имя папки класса всегда начинается со @
символ, за которым следует имя класса для имени папки. Папка класса должна содержаться в папке path, но папка класса не находится в пути MATLAB. Поместите файл определения класса в папку класса, которая также может содержать отдельные файлы метода. Файл определения класса должен иметь то же имя что и папка класса (без @
символ).
.../parent_folder/@MyClass/MyClass.m .../parent_folder/@MyClass/myMethod1.m .../parent_folder/@MyClass/myMethod2.m
Задайте только один класс в папке. Все файлы имеют .m
или .p
расширение. Для версий MATLAB R2018a и более поздних, автономные методы можно live функции с помощью .mlx
расширение.
Используйте папку класса, когда вы хотите использовать более одного файла для определения класса. MATLAB обрабатывает любой файл функции в папке класса как метод класса. Файлы функции могут быть кодом MATLAB (.m
), формат файла Живого кода (.mlx
), MEX-функции (зависящие от платформы расширения) и Pcode-файлы (.p
).
MATLAB явным образом определяет любой файл в папке класса как метод этого класса. Это позволяет вам использовать более модульный подход к авторским методам вашего класса.
Базовое имя каждого файла должно быть допустимым именем функции MATLAB. Допустимые имена функции начинаются с буквенного символа и могут содержать буквы, цифры или символ нижнего подчеркивания. Для получения дополнительной информации смотрите Методы в отдельных файлах.
Частные папки содержат функции, которые доступны только из функций, определенных в папках, непосредственно над private
папка. Любые функции, определенные в private
папка внутри папки класса может вызываться только из методов класса. Функции имеют доступ к частным представителям класса, но сами по себе не являются методами. Они не требуют, чтобы объект был передан как вход и могут быть вызваны только с помощью обозначения функции. Используйте функции в private
папки, когда вам нужны вспомогательные функции, которые можно вызвать из нескольких методов вашего класса.
Если папка класса содержит private
папка, только класс, заданный в этой папке, может получить доступ к функциям, заданным в private
папка. Подклассы не имеют доступа к частным функциям суперкласса. Дополнительные сведения о частных папках см. в разделе «Частные функции».
Если необходимо, чтобы подкласс имел доступ к частным функциям суперкласса, задайте функции как защищенные методы суперкласса. Задайте методы с Access
для атрибута задано значение protected
.
Если класс задает функции в private
папка, которая находится в папке классов, затем MATLAB следует этим правилам приоритета при отправке частным функциям в зависимости от методов classdef
файл:
Использование записи через точку (obj.methodName
), функция в private
папка имеет приоритет над методом, заданным в classdef
файл.
Использование обозначения (methodName(obj)
), метод, заданный в classdef
файл имеет приоритет над функцией в private
папка.
Вы не можете поместить определения классов (classdef
файл) в частных папках, поскольку это не соответствует требованиям для папок классов или путей.
Когда существует несколько определений классов с одним и тем же именем, расположение файла на пути MATLAB определяет приоритет. Определение класса в папке, которое находится на первом месте в пути MATLAB, всегда имеет приоритет над любыми классами, которые позже находятся в пути, независимо от того, содержатся ли определения в папке класса.
Функция с таким же именем, как и класс в папке path, имеет приоритет над классом, если функция находится в папке, которая находится ранее в пути. Однако класс, заданный в папке класса (@ -folder), имеет приоритет над функцией с таким же именем, даже если функция определена в папке, которая находится ранее в пути.
Например, рассмотрим путь со следующими папками и файлами.
Порядок в пути | Папка и файл | Файл задает |
---|---|---|
1 |
| Классы |
2 |
| Функциональные |
3 |
| Классы |
4 |
| Метод |
5 |
| Классы |
MATLAB применяет эту логику, чтобы определить, какая версия Foo
для вызова:
Классы fldr1/Foo.m
имеет приоритет над классом fldr3/@Foo
потому что:
fldr1
перед fldr3
на пути, и fldr1/Foo.m
является классом.
Классы fldr3/@Foo
имеет приоритет над функцией fldr2/Foo.m
потому что:
fldr3/@Foo
является классом в папке классов.
fldr2/Foo.m
не является классом.
Классы в папках классов имеют приоритет над функциями.
Функциональные fldr2/Foo.m
имеет приоритет над классом fldr5/Foo.m
потому что:
fldr2
приходит перед классом fldr5
на пути.
fldr5/Foo.m
не находится в папке класса.
Классы, которые не определены в папках классов, подчиняются порядку пути относительно функций.
Классы fldr3/@Foo
имеет приоритет над fldr4/@Foo
потому что:
fldr3
приходит перед fldr4
на пути.
Если fldr3/@Foo/Foo.m
содержит класс MATLAB, созданный до версии 7.6 (то есть класс не использует classdef
ключевое слово), затем fldr4/@Foo/bar.m
становится методом Foo
класс, заданный в fldr3/@Foo
.
В MATLAB версий 5-7 папки классов не затеняют другие папки классов, имеющие то же имя, но находятся в более поздних папках путей. Вместо этого класс использует комбинацию методов из всех папок классов, имеющих одинаковое имя, для определения класса. Такое поведение больше не поддерживается.
Для обратной совместимости классы, заданные в папках классов, всегда имеют приоритет над функциями и скриптами, имеющими то же имя. Этот приоритет применяется к функциям и скриптам, которые приходят перед этими классами в пути.
MATLAB может распознать только одно определение класса как текущее определение. Изменение пути MATLAB может изменить файл определения для класса (см. path
). Если образцы старого определения не существует (то есть определение, которое больше не находится в пути первым), MATLAB немедленно распознает новую папку как текущее определение. Если перед изменением пути у вас есть существующий образец класса, то использование MATLAB определения в новой папке зависит от того, как был определен новый класс. Если новое определение задано в папке класса, MATLAB немедленно распознает новую папку как текущее определение класса. Однако для классов, которые определены в папках путь (то есть не в классе @
папки), необходимо удалить класс, прежде чем MATLAB распознает новую папку как текущее определение класса.
Предположим, что вы задаете две версии класса с именем Foo
в двух папках, fldA
и fldB
.
fldA/@Foo/Foo.m fldB/@Foo/Foo.m
Добавить папку fldA
в верхней части пути.
addpath fldA
Создайте образец классов Foo
. MATLAB использует fldA/@Foo/Foo.m
как определение класса.
a = Foo;
Измените текущую папку на fldB
.
cd fldB
Текущая папка всегда находится первой в пути. Поэтому MATLAB находит fldB/@Foo/Foo.m
как определение для Foo
классов.
b = Foo;
MATLAB автоматически обновляет существующий образец, a
, чтобы использовать новое определение класса в fldB
.
Предположим, что вы задаете две версии класса с именем Foo
в двух папках, fldA
и fldB
, но не используйте папку класса.
fldA/Foo.m fldB/Foo.m
Добавить папку fldA
в верхней части пути.
addpath fldA
Создайте образец классов Foo
. MATLAB использует fldA/Foo.m
как определение класса.
a = Foo;
Измените текущую папку на fldB
.
cd fldB
Текущая папка фактически находится в верхней части пути. Однако MATLAB не идентифицирует fldB/Foo.m
как определение для Foo
классов. MATLAB продолжает использовать исходное определение класса до тех пор, пока вы не очистите класс.
Как использовать определение Foo
в foldB
, очистить Foo
.
clear Foo
MATLAB автоматически обновляет существующие объекты, чтобы соответствовать определению класса в fldB
. Обычно удаление переменных образца не требуется.