exponenta event banner

Папки, содержащие определения классов

Определения классов на пути

Для вызова метода класса определение класса должно находиться в пути 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. Определение класса в папке, которая занимает первое место в пути MATLAB, всегда имеет приоритет над любыми классами, которые позже находятся в пути, независимо от того, содержатся ли определения в папке класса.

Функция с тем же именем, что и класс в папке пути, имеет приоритет над классом, если функция находится в папке, расположенной ранее по пути. Однако класс, определенный в папке класса (@ -folder), имеет приоритет над функцией с тем же именем, даже если функция определена в папке, расположенной ранее по пути.

Например, рассмотрим путь со следующими папками и файлами.

Порядок в путиПапка и файлОпределение файла

1

fldr1/Foo.m

Класс Foo

2

fldr2/Foo.m

Функция Foo

3

fldr3/@Foo/Foo.m

Класс Foo

4

fldr4/@Foo/bar.m

Метод bar

5

fldr5/Foo.m

Класс Foo

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. Обычно очистка переменных экземпляра не требуется.

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