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

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

Чтобы вызвать метод класса, определение класса должно быть на пути MATLAB®, как описано в следующих разделах.

Папки Class и Path

Существует два типа папок, которые могут содержать файлы определения класса.

  • Папки пути — папка находится на пути MATLAB, и имя папки не начинается с @ символ. Используйте этот тип папки, когда это необходимо, несколько классов и функций в одной папке. Целое определение класса должно содержаться в одном файле.

  • Папки класса — имя папки начинается с символа @, сопровождаемого именем класса. Папка не находится на пути MATLAB, но его родительская папка находится на пути. Используйте этот тип папки, когда это необходимо, чтобы использовать несколько файлов для одного определения класса.

Смотрите path функция для получения информации о пути MATLAB.

Используя папки пути

Папки, которые содержат файлы определения класса, находятся на пути MATLAB. Поэтому определения классов, помещенные в папки пути, ведут себя как любая обычная функция относительно приоритета — первое вхождение имени на пути 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 файл) в частных папках, потому что выполнение так не удовлетворило бы требования для папок class или path.

Приоритет класса и путь MATLAB

Когда существует несколько определений классов с тем же именем, расположение файла на пути MATLAB определяет приоритет. Определение класса в папке, которая на первом месте на пути MATLAB всегда, более приоритетно по сравнению с любыми классами, которые являются позже путем, содержатся ли определения в папке класса.

Функция с тем же именем как класс в папке path более приоритетна по сравнению с классом, если функция находится в папке, которая является раньше путем. Однако класс, заданный в папке класса (-папка), более приоритетен по сравнению с функцией того же имени, даже если функция задана в папке, которая является раньше путем.

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

Закажите в путиПапка и файлФайл задает

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.

Предыдущее поведение классов, заданных в папках класса

В Версиях 5 - 7 MATLAB папки класса не делают тени другие папки класса, имеющие то же имя, но находящиеся в более поздних папках пути. Вместо этого класс использует комбинацию методов от всех папок класса, имеющих то же имя, чтобы задать класс. Это поведение больше не поддерживается.

Для обратной совместимости классы, заданные в папках класса всегда, более приоритетны по сравнению с функциями и скриптами, имеющими то же имя. Этот приоритет применяется к функциям и скриптам, которые появляются перед этими классами в путь.

Изменение пути, чтобы обновить определение класса

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

Похожие темы