Для вызова метода класса определение класса должно находиться в пути MATLAB ®, как описано в следующих разделах.
Существует два типа папок, которые могут содержать файлы определений классов.
Папки путей - папка находится в пути MATLAB, и имя папки не начинается с @ персонаж. Используйте этот тип папки, если требуется несколько классов и функций в одной папке. Все определение класса должно содержаться в одном файле.
Папки классов - имя папки начинается с символа @, за которым следует имя класса. Папка не находится в пути MATLAB, но ее родительская папка находится в пути. Используйте этот тип папки, если требуется использовать несколько файлов для одного определения класса.
См. раздел path для получения информации о пути MATLAB.
Папки, содержащие файлы определений классов, находятся в пути MATLAB. Поэтому определения классов, помещенные в папки путей, ведут себя как любая обычная функция относительно приоритета - первое вхождение имени на пути MATLAB имеет приоритет над всеми последующими вхождениями с тем же именем.
Имя каждого файла определения класса должно совпадать с именем класса, указанного в classdef ключевое слово. Использование папки пути исключает необходимость создания отдельной папки класса для каждого класса. Однако все определение класса, включая все методы, должно содержаться в одном файле.
Предположим, что в одной папке определены три класса:
.../path_folder/MyClass1.m .../path_folder/MyClass2.m .../path_folder/MyClass3.m
Чтобы использовать эти классы, добавьте path_folder к пути MATLAB:
addpath path_folderИмя папки класса всегда начинается с @ символ, за которым следует имя класса для имени папки. Папка класса должна содержаться в папке пути, но папка класса не находится в пути MATLAB. Поместите файл определения класса в папку класса, которая также может содержать отдельные файлы методов. Имя файла определения класса должно совпадать с именем папки класса (без @ символ).
.../parent_folder/@MyClass/MyClass.m .../parent_folder/@MyClass/myMethod1.m .../parent_folder/@MyClass/myMethod2.m
Определите только один класс для каждой папки. Все файлы имеют .m или .p расширение. Для версий MATLAB R2018a и более поздних автономные методы могут быть динамическими функциями с .mlx расширение.
Используйте папку класса, если требуется использовать несколько файлов для определения класса. MATLAB рассматривает любой файл функции в папке класса как метод класса. Файлы функций могут быть кодом MATLAB (.m), формат файла Live Code (.mlx), функции MEX (расширения, зависящие от платформы) и файлы P-кода (.p).
MATLAB явно идентифицирует любой файл в папке класса как метод этого класса. Это позволяет использовать более модульный подход к разработке методов класса.
Базовым именем каждого файла должно быть допустимое имя функции MATLAB. Допустимые имена функций начинаются с алфавитного символа и могут содержать буквы, цифры или знаки подчеркивания. Дополнительные сведения см. в разделе Методы в отдельных файлах.
Частные папки содержат функции, доступные только из функций, определенных в папках непосредственно над private папка. Любые функции, определенные в private папка внутри папки класса может вызываться только из методов класса. Функции имеют доступ к частным членам класса, но сами по себе не являются методами. Они не требуют передачи объекта в качестве входных данных и могут вызываться только с помощью нотации функции. Использовать функции в private папки, когда вам нужны вспомогательные функции, которые можно вызвать из нескольких методов вашего класса.
Если папка класса содержит private , только класс, определенный в этой папке, может иметь доступ к функциям, определенным в private папка. Подклассы не имеют доступа к частным функциям суперкласса. Дополнительные сведения о частных папках см. в разделе Частные функции.
Если требуется, чтобы подкласс имел доступ к частным функциям суперкласса, определите функции как защищенные методы суперкласса. Укажите методы с помощью Access атрибут имеет значение protected.
Если класс определяет функции в private папка, которая находится в папке класса, затем MATLAB следует этим правилам приоритета при отправке в частные функции по сравнению с методами classdef файл:
Использование точечной нотации (obj.methodName), функция в private имеет приоритет над методом, определенным в classdef файл.
Использование нотации функции (methodName(obj)), метод, определенный в classdef файл имеет приоритет над функцией в private папка.
Нельзя помещать определения классов (classdef ) в частных папках, поскольку это не соответствует требованиям для папок классов или путей.
При наличии нескольких определений классов с одинаковыми именами приоритет определяется расположением файла по пути MATLAB. Определение класса в папке, которая занимает первое место в пути MATLAB, всегда имеет приоритет над любыми классами, которые позже находятся в пути, независимо от того, содержатся ли определения в папке класса.
Функция с тем же именем, что и класс в папке пути, имеет приоритет над классом, если функция находится в папке, расположенной ранее по пути. Однако класс, определенный в папке класса (@ -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 FooMATLAB автоматически обновляет существующие объекты в соответствии с определением класса в fldB. Обычно очистка переменных экземпляра не требуется.