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

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

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

Функция с таким же именем, как и класс в папке path, имеет приоритет над классом, если функция находится в папке, которая находится ранее в пути. Однако класс, заданный в папке класса (@ -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. Обычно удаление переменных образца не требуется.

Похожие темы